f编程中fflush(stdin)的用途是什么?

Mah*_*ahi 19 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);

        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:");
}
Run Code Online (Sandbox Code Playgroud)

fflush(stdin)在这个程序中有什么用?

Yu *_*Hao 25

它不在标准C中,因此行为未定义.

一些实现使用它来清除stdin缓冲区.

从C11 7.21.5.2 fflush函数,fflush只适用于输出/更新流,而不是输入流.

如果流指向输入流或未输入最近操作的更新流,则fflush功能会将该流的任何未写入数据传送到主机环境以写入该文件; 否则,行为未定义.

  • +1.从C标准来看,这是完全正确的.一些实现为`fflush()输入流提供了语义,但这是一个扩展. (8认同)

iab*_*der 11

stdin在读取之前清除缓冲区.从手册:

对于输出流,fflush()强制通过流的底层写入函数写入给定输出或更新流的所有用户空间缓冲数据.对于输入流,fflush()会丢弃从底层文件中提取但尚未被应用程序使用的任何缓冲数据.

注意:这是特定fflush()于Linux的,使用输入流的标准未定义,但是,大多数实现与Linux中的行为相同.


小智 5

从输入缓冲区中删除所有数据到下一个换行符是一种不可移植的方法.我已经看到它用于这样的情况:

char c;
char s[32];
puts("Type a char");
c=getchar();
fflush(stdin);
puts("Type a string");
fgets(s,32,stdin);
Run Code Online (Sandbox Code Playgroud)

没有fflush(),如果你输入一个字符,说"a",然后点击输入,输入缓冲区包含"a \n",getchar()查看"a",但"\n"保留在缓冲区中,所以下一个fgets()将找到它并返回一个空字符串,甚至没有等待用户输入.

但是,请注意,这种使用fflush()是不可移植的.我现在已经在Linux机器上进行了测试,但它不起作用,例如.