我有以下程序
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ans[8];
int i;
for(i=1;i<=3;i++)
{
printf("\n What is the unit of traffic ?");
scanf("%s",ans);
fflush(stdin);
if(stricmp(ans,"Earlang")==0)
{
printf("\nAnswer is correct");
exit(1);
}
else
if(i<3)
printf("\n Try Again!\n");
}
printf("\n Nunit of traffic is Earlang:");
}
fflush(stdin)在这个程序中有什么用?
答案 0 :(得分:23)
它不在标准C中,因此行为未定义。
某些实现使用它来清除stdin
缓冲区。
从C11 7.21.5.2 fflush功能,fflush
仅适用于输出/更新流,而不适用于输入流。
如果流指向输出流或最新的流更新流 如果没有输入操作,fflush函数会导致该流的任何未写入数据 要传递到主机环境以写入文件;否则,行为是 未定义。
答案 1 :(得分:10)
在阅读之前清除stdin
缓冲区。来自男人page:
对于输出流,fflush()强制写入所有缓冲的用户空间 通过流的底层提供给定输出或更新流的数据 写功能。 对于输入流,fflush()会丢弃所有缓冲数据 已经从底层文件中获取但尚未获取 由应用程序使用。
注意:这是特定于Linux的,在标准中未定义输入流上使用fflush()
,但是,大多数实现与Linux中的行为相同。
答案 2 :(得分:5)
从输入缓冲区中删除所有数据到下一个换行符是一种不可移植的方法。 我已经看到它用于这样的情况:
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()
的使用是不可移植的。我现在已经在Linux机器上进行了测试,但它不起作用,例如。