c++ - `ncurses` 函数 `wgetstr` 正在修改我的变量

标签 c++ string segmentation-fault ncurses

解决方案 显然,wgetstr 函数不会创建新缓冲区。如果第二个参数称为 data 并且大小为 n 并且您输入的字符数超过 n ,它将访问和覆盖内存中不属于 data 的部分,例如内存中存储 cursorY 的位置。为了使一切正常,我用 data (八个空格)声明了 char data[] = " "; 并写了 wgetnstr(inputWin, data, 8);

-------------------------------------------------- -------------------------------------------------- ----------

似乎 ncurses 函数 wgetstr 确实在改变我的变量的值。在一个名为 playGame 的函数中,我有一个名为 cursorY 的变量(类型为 int ),每当我按下键盘上的向上或向下箭头时都会调整它(这很好用)。

请看一下这段代码( inputWin 的类型为 WINDOW* ):

mvprintw(0, 0, (to_string(cursorY)).c_str());
refresh();
usleep(500000);

wgetstr(inputWin, data);

mvprintw(0, 0, (to_string(cursorY)).c_str());
refresh();
usleep(500000);

假设我将光标移动到第 6 行,然后按 Enter(这会导致执行这段代码)。我可以做两件事:
  • 只输入 1 个字符。在两次 refresh 调用之后,值 6 将显示在屏幕上(位置 (0, 0))。
  • 输入 2 个或更多字符。在这种情况下,在第一个 refresh 调用之后我只是得到 6,但在第二个之后,我神奇地得到 0。

  • 上面代码后的前两行是
    noecho();
    _theView -> _theActualSheet -> putData(cursorY-1, cursorX/9 - 1, data);
    

    (不要担心实际参数:关于它们的数学检查)。当我在 putData 时,我得到一个 Segmentation fault ,而 gdb 表示 putData 的第一个参数是-1,所以 cursorY 必须为 0(putData 的前两个参数用于使用 0x104576 访问二维数组,其中 SheetCells[row][column]row 分别是 column 的第一个和第二个形参)。

    显然, putData 修改了 wgetstr 的值。后一个变量的名称无关紧要:将其更改为 cursorY 或类似 cursorrY 之类的怪异(是的,我已经尝试过)不起作用。什么样的作品将上面的代码替换为
    mvprintw(0, 0, (to_string(cursorY)).c_str());
    refresh();
    usleep(500000);
    
    int a = cursorY;
    wgetstr(inputWin, data);
    cursorY = a;
    
    mvprintw(0, 0, (to_string(cursorY)).c_str());
    refresh();
    usleep(500000);
    

    在这两种情况下,我都会在屏幕的左上角看到 6。但是,知道字符串的行为很奇怪:当我输入 monkeyBusiness 作为我的字符串时,然后向右移动(即,我按键盘上的右键),然后再次输入 asdf ,我得到 asdf

    所以基本上,我想知道两件事:
  • 为什么 hell 是 as^a 更改我的变量?
  • 为什么只有输入超过1个字符才会出现?
  • 一般而言,wgetstr 似乎有什么问题?处理输入似乎很糟糕。

  • 我可以尝试其他事情(比如手动读取字符,然后将 wgetstr 与它们连接起来),但是 data 似乎非常适合我想做的事情,我没有理由在这里切换。

    任何帮助深表感谢。 (请记住:我特别想知道为什么要更改 wgetstr 的值。如果您建议不要使用 cursorY 并有一个好的替代方案,请告诉我,但我最想知道为什么 wgetstr 被更改了。 )

    编辑 变量 cursorY 的类型为 data 并声明如下: char[] 。我没有“清除”这个变量(即删除所有“字母”),但我认为这没有任何区别,因为我认为 char data[] = "" 只是覆盖了整个变量(或者我在这里大错特错了吗?)。

    最佳答案

    您为数据提供的缓冲区 data , 被定义为单个字符长(只有空终止符会在那​​里)。这意味着如果您输入一个或多个字符的任何输入,您将在数据提供的空间之外写入,从而覆盖其他内容。看起来 cursorY 是被击中的幸运变量。

    您需要确保数据至少足够大以处理所有输入。最好,你应该切换到一些输入函数(比如 wgetnstr ),它可以让你传递缓冲区的大小,否则总是有可能通过输入足够的字符来崩溃你的应用程序。

    关于c++ - `ncurses` 函数 `wgetstr` 正在修改我的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35816585/

    相关文章:

    c++ - vector 与动态数组,速度上有很大差异吗?

    c++ - 函数中未声明的变量

    c++ - IOS 上的 OpenCV 来自 C++ 的 haar 级联 xml 文件路径问题

    c# - 为什么字符串不比较引用?

    java - 在 txt 文件 Java 中查找一个字符串(或一行)

    根据用户输入构造二维数组的正确方法

    c++ - 是否允许编译器优化依赖于具有未声明值的枚举的分支?

    c++ - 宏长字符串问题

    c - 数据处理代码中的段错误

    linux - 在linux中预加载动态加载的库