所以,这是我的问题。我正在使用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();
答案 0 :(得分:1)
以下是基于您的代码的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
并返回,然后 Control-D 表示输入结束(EOF),其余输出为:< / p>
$ ./curses
Up Arrow
sssddd
Read: sssddd
Early exit
$
除了标准输出上的缓冲之外,它的行为正如我所期望的那样。没有办法在此程序中找到Late exit
print语句。
答案 1 :(得分:-2)
如上所述输入未定义。此外,fgets用于文件输入流,而不是用于读取std输入流。 (改用使用获取)