我有以下程序
#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)
在这个程序中有什么用?
它不在标准C中,因此行为是未定义的。
一些实现使用它来清除stdin
缓冲区。
根据C11 7.21.5.2fflush函数,fflush
仅适用于输出/更新流,而不适用于输入流。
如果流指向输出流或更新流操作未输入,fflush函数会导致该流的任何未写入数据以被传送到主机环境以被写入文件;否则,行为为未定义。
它在读取之前清除stdin
缓冲区。来自手册页:
对于输出流,fflush()强制写入所有缓冲的用户空间给定输出或通过流的底层更新流的数据写入函数对于输入流,fflush()将丢弃任何缓冲的数据已从基础文件中提取,但尚未由应用程序消耗
注意:这是特定于Linux的,在输入流上使用fflush()
是标准未定义的,但是,大多数实现的行为与Linux中相同。
这是一种不可移植的方法,可以从输入缓冲区中删除所有数据,直到下一行。我见过这种情况:
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机器上进行了测试,但它不起作用。