这里是一个SSCCE根据您的代码(Short, Self-Contained, Complete Example):
#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
并返回,然后控制-d以指示输入(EOF)的端部,和输出的其余部分是:
$ ./curses
Up Arrow
sssddd
Read: sssddd
Early exit
$
它是所有除了标准输出上的缓冲之外,其行为与我所预期的相同。在这个程序中没有办法到达Late exit
打印声明。
“输入”在哪里定义? – templatetypedef 2013-03-12 03:36:31
@templatetypedef立即检查 – NoNameY0 2013-03-12 03:42:23
请注意,尽管有缩进,两个'fflush(stdout);'调用都是无条件的。你需要大括号(或逗号代替分号 - ick!)以使它们成为有条件的。 – 2013-03-12 03:51:48