繁体   English   中英

为什么任意键盘输入会改变 c 中的其他 memory,诅咒?

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

我正在 C 中试验 Curses,由于某种原因,当我在运行程序时输入一个键时,球会改变方向。 我不知道为什么; 这可能是 memory 泄漏吗? 我不知道该尝试什么,因为我是 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);

从手册

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

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

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

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

编辑编辑:这会在多余的字符上发出哔哔声,这可能是你不想要的。 改用getch什么的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM