c编程中fflush(stdin)的用法是什么

我有以下程序

#include  #include  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.2 fflushfunctionfflush仅适用于输出/更新流,而不适用于输入流。

如果流指向输入流或未输入最近操作的更新流,则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机器上进行了测试,但它不起作用。