这是一个基于您的代码的 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 exit
print 语句。