解决方案 显然,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(这会导致执行这段代码)。我可以做两件事:
refresh
调用之后,值 6 将显示在屏幕上(位置 (0, 0))。 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
。所以基本上,我想知道两件事:
as^a
更改我的变量? wgetstr
似乎有什么问题?处理输入似乎很糟糕。 我可以尝试其他事情(比如手动读取字符,然后将
wgetstr
与它们连接起来),但是 data
似乎非常适合我想做的事情,我没有理由在这里切换。任何帮助深表感谢。 (请记住:我特别想知道为什么要更改
wgetstr
的值。如果您建议不要使用 cursorY
并有一个好的替代方案,请告诉我,但我最想知道为什么 wgetstr
被更改了。 )编辑 变量
cursorY
的类型为 data
并声明如下: char[]
。我没有“清除”这个变量(即删除所有“字母”),但我认为这没有任何区别,因为我认为 char data[] = ""
只是覆盖了整个变量(或者我在这里大错特错了吗?)。
最佳答案
您为数据提供的缓冲区 data
, 被定义为单个字符长(只有空终止符会在那里)。这意味着如果您输入一个或多个字符的任何输入,您将在数据提供的空间之外写入,从而覆盖其他内容。看起来 cursorY 是被击中的幸运变量。
您需要确保数据至少足够大以处理所有输入。最好,你应该切换到一些输入函数(比如 wgetnstr
),它可以让你传递缓冲区的大小,否则总是有可能通过输入足够的字符来崩溃你的应用程序。
关于c++ - `ncurses` 函数 `wgetstr` 正在修改我的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35816585/