在stdin中非法使用fflush()?该怎么做?

时间:2015-03-10 03:19:03

标签: c stdin fflush

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()没有定义或标准?

3 个答案:

答案 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)

感兴趣