0

所以,这是我的问题。我正在使用 ncurses,当我按下向上或向下按钮时,它会显示向上箭头,所以我希望继续我的 while 循环,并接受进一步的输入。问题是,在这个过程中输入的变量以某种方式变为 NULL 并且它存在。这是为什么?我想要的是它打印向上或向下箭头,并且程序正常进行。

int ch;
char input[100];
initscr();
raw();
keypad(stdscr, TRUE);
noecho();
ch = getch();
if(ch== KEY_UP)
    printf("\nUp Arrow"); fflush(stdout);

if(ch== KEY_DOWN)
    printf("\ndown Arrow");fflush(stdout);

endwin();
4

2 回答 2

1

这是一个基于您的代码的 SSCCE(简短、独立、完整的示例):

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>

int main(void)
{
    int ch;
    char input[100];

    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();
    ch = getch();
    endwin();

    if (ch== KEY_UP)
        printf("\nUp Arrow\n");

    if (ch== KEY_DOWN)
        printf("\ndown Arrow\n");

    fflush(stdout);

    while(1)
    {
        if (fgets(input, sizeof (input), stdin) == NULL) 
        {
            printf("Early exit\n");
            exit(0);
        }
        printf("Read: %s", input);
        fflush(stdout);
    }

    printf("Late exit\n");
    return 0;
}

当我运行它时,它会正确检测我是否使用向上或向下箭头键,并在我调用之后endwin()而不是之前报告它。通常fflush()不需要调用,但似乎标准输出是完全缓冲的,而不是在你完成后缓冲的行curses,这有点令人惊讶。(我在 Mac OS X 10.8.2 上进行测试。)

我使用的另一个技巧是诊断打印,所以我知道发生了什么。我调用了程序curses,当我运行它时,屏幕清除了;然后我输入了一个向上箭头(在这种情况下),然后sssddd返回,然后Control-D表示输入结束(EOF),其余的输出是:

$ ./curses

Up Arrow
sssddd
Read: sssddd
Early exit
$

除了标准输出的缓冲之外,它的行为都符合我的预期。在这个程序中没有办法进入Late exitprint 语句。

于 2013-03-12T04:34:59.003 回答
-2

如前所述,输入未定义。此外, fgets 用于文件输入流,而不是用于读取 std 输入流。(改用gets)

于 2013-03-12T03:45:35.130 回答