char c;
char s[32];
puts("Type a char");
c=getchar();
fflush(stdin);
puts("Type a string");
fgets(s,32,stdin);
如果没有fflush(),如果你输入一个字符,说" a"和点击输入,输入缓冲区包含" a \ n",getchar()偷看" a",但" \ n"保留在缓冲区中,所以下一个fgets()会找到它并返回一个空字符串,甚至不用等待用户输入。
应该做些什么呢?据我所知,在输入流上使用fflush()没有定义或标准?
答案 0 :(得分:2)
当您的意图是阅读一行输入并从中解释一个字符时,请不要使用getchar
。在这种情况下,请阅读fgets
或类似的行,然后检查第一行。
或者,您可以坚持使用getchar
,但是您需要继续阅读字符直到行尾,并在继续之前抛弃它们。
您的程序可以转换为(第一种方法):
char c;
char s[32];
puts("Type a char");
fgets(s,32,stdin);
c=s[0];
puts("Type a string");
fgets(s,32,stdin);
请注意,这缺少检查返回值,并且不处理超过32个字节的输入,但它是一个开始,这些是您可以处理的单独问题。
答案 1 :(得分:1)
如果您尝试丢弃输入行的其余部分,请执行以下操作:
int ch;
while ( (ch = getchar()) != '\n' && ch != EOF) { }
这会读取字符,直到不再存在,或者它会到达行尾。
请注意,您应该使用int c;
而不是char c;
。 getchar()
函数实际上不返回char
值;它返回将该char转换为unsigned char
的结果。
答案 2 :(得分:0)
了解fflush(3);您可能希望在 fflush(NULL);
之前致电c=getchar();
,但这可能无法正常使用。
请记住,在Linux上,至少终端通常是内核缓冲的(并且 stdio 缓冲)。详细了解tty - s。因此,在用户按下 enter 键之前,您通常无法获得任何输入。
您应该重新考虑您的程序并阅读整行(通常在足够大的缓冲区上使用getline(3)或fgets(3))。
如果您想在Linux(或其他POSIX系统)上进行单独的按键操作,则需要一个像ncurses这样的库(在原始模式下与终端配合使用)。您可能对readline(3)
感兴趣