【问题标题】:Why does arbitrary keyboard input change other memory in c, curses?为什么任意键盘输入会改变c,curses中的其他内存?
【发布时间】:2020-10-26 20:35:44
【问题描述】:

我正在用 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;
}

【问题讨论】:

    标签: c pointers memory memory-leaks curses


    【解决方案1】:

    只看你的代码

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

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

    然后你打电话

    getstr(&input);
    

    来自手册

    函数 getstr 等价于对 getch 的一系列调用,直到收到换行符或回车符(终止字符不包含在返回的字符串中)。结果值放在字符指针str指向的区域中。

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

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

    编辑: 试试getnstr( &amp;input, 1 ) 可能吗?

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这并不能解释为什么我之前遇到了问题,但现在可以了 - 谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2011-08-01
      • 2015-02-22
      相关资源
      最近更新 更多