在c编程中,fflush(stdin)有什么用途?
我有以下程序在c编程中,fflush(stdin)有什么用途?,c,C,我有以下程序 #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);
#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:");
}
#包括
#包括
int main()
{
char-ans[8];
int i;
对于(i=1;i它在读取之前清除stdin
缓冲区。从man:
对于输出流,fflush()强制写入所有缓冲的用户空间
给定输出或更新流的数据,通过流的底层
写入函数。对于输入流,fflush()丢弃任何缓冲数据
已从基础文件中获取,但尚未
被应用程序使用。
注意:这是特定于Linux的,在输入流上使用fflush()
是标准中未定义的,但是,大多数实现的行为与Linux中相同。它不在标准C中,因此行为未定义
一些实现使用它来清除stdin
缓冲区
从C117.21.5.2中的fflush函数来看,fflush
仅适用于输出/更新流,而不适用于输入流
If流指向输出流或更新流,其中最近的
未输入操作,fflush函数会导致该流的任何未写入数据
发送到主机环境以写入文件;否则,行为为
未定义
在下一行换行之前,从输入缓冲区中删除所有数据是一种不可移植的方法。
我见过在这样的情况下使用它:
char c;
char s[32];
puts("Type a char");
c=getchar();
fflush(stdin);
puts("Type a string");
fgets(s,32,stdin);
没有fflush()
,如果您键入一个字符,比如说“a”,然后按enter键,输入缓冲区将包含“a\n”,而getchar()
会偷看“a”,但“\n”仍保留在缓冲区中,因此下一个fgets()
将找到它并返回一个空字符串,而无需等待用户输入
但是,请注意,fflush()
的这种用法是不可移植的。例如,我现在已经在Linux机器上进行了测试,但它不起作用。在上面的程序中,即使没有编写fflush(stdin),程序也会执行,但如何执行fflush(stdin)将非常有用。请建议。@user2526830我不知道你在说什么,但就像我说的那样,它会在再次读取之前清除缓冲区。@user2526830它将确保程序始终在不同的机器上正确执行,在不同的系统负载下运行,而不仅仅是在你的机器上。手册页实际上是一个bit误导性:它描述了可查找输入流的(POSIX强制的,而不仅仅是Linux特定的)行为。在stdin上调用Linux时,Linuxfflush
完全不做任何事情(它尝试lseek
,捕获ESPIPE
,然后完全不做任何事情)+1.从C标准的角度来看,这是完全正确的。一些实现为输入流的fflush()
ing提供了语义,但这是一个扩展。@MitchWheat正如您(应该)知道的,很多文档都不会提到fflush(stdin)
,因为它只在某些平台上有一个定义的行为。一开始对此感到困惑是完全正常的(例如,肯定有大量重复的问题)。在linux中使用:#include void clean_stdin(void){int c;do{c=getchar();}而(c!='\n'&&c!=EOF)}