在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时,Linux
fflush
完全不做任何事情(它尝试
lseek
,捕获
ESPIPE
,然后完全不做任何事情)+1.从C标准的角度来看,这是完全正确的。一些实现为输入流的
fflush()
ing提供了语义,但这是一个扩展。@MitchWheat正如您(应该)知道的,很多文档都不会提到
fflush(stdin)
,因为它只在某些平台上有一个定义的行为。一开始对此感到困惑是完全正常的(例如,肯定有大量重复的问题)。在linux中使用:#include void clean_stdin(void){int c;do{c=getchar();}而(c!='\n'&&c!=EOF)}