为什么任意键盘输入会改变c,curses中的其他内存?

Why does arbitrary keyboard input change other memory in c, curses?

我正在 C 中试验 Curses,出于某种原因,当我在 运行 我的程序中输入一个键时,球会改变方向。我不知道为什么;这可能是内存泄漏吗?我不知道该尝试什么,因为我是 C 的初学者。请提供任何指导!

#include <curses.h>
#include <stdbool.h>

typedef struct ball {
    unsigned int x;
    unsigned int y;
    const char shape;
} Ball;

int main() {
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
curs_set(FALSE);
nodelay(stdscr, TRUE);

int maxY, maxX;
int pOneGoingRight = TRUE;
int pOneGoingDown = TRUE;
getmaxyx(stdscr, maxY, maxX);
char input;

Ball pOneBall = {0, 0, '*'};
// Ball *pOneBallPtr = &pOneBall;

while (1) {
    clear();
    
    getstr(&input);
    if (input == 'q')
        break;
    
    mvprintw(0, 0, "Max y and x: %d, %d", maxY, maxX); 
    mvprintw(1, 0, "Ball y and x: %d, %d", pOneBall.y, pOneBall.x);
    
    if (pOneBall.y == 0) pOneGoingDown = TRUE; 
    else if (pOneBall.y == maxY) pOneGoingDown = FALSE;
    
    if (pOneBall.x == 0) pOneGoingRight = TRUE; 
    else if (pOneBall.x == maxX) pOneGoingRight = FALSE;
    
    if (pOneGoingRight) pOneBall.x++;
    else pOneBall.x--;
    
    if (pOneGoingDown) pOneBall.y++;
    else pOneBall.y--;
    
    mvprintw(pOneBall.y, pOneBall.x, &pOneBall.shape);
    refresh();
    
    napms(100);

}

endwin();
return 0;
}

看看你的代码

char input;

Ball pOneBall = {0, 0, '*'};

好的,所以你有一个保存键的输入,然后是一个保存球数据的结构。

那你打电话

getstr(&input);

来自手册

The function getstr is equivalent to a series of calls to getch, until a newline or carriage return is received (the terminating character is not included in the returned string). The resulting value is placed in the area pointed to by the character pointer str.

这意味着 getstr 正在从键盘读取,直到读取换行符或回车 return。没有什么可以阻止它读取 10 个或一百个字符,并将它们写在后面的数据上,作为你的球位置信息。

如果要读取单个字符或其他方法,请使用getch。由于似乎没有 any 方法来限制 getstr 读取的字符数,所以永远不要使用它。曾经。

编辑: 也许试试 getnstr( &input, 1 )

编辑-编辑: 这会在您可能不想要的多余字符上发出哔哔声。只需更改为使用 getch 或其他东西

只需更改 getstr(&input);通过 input=getch();