20

我有以下程序

#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)这个程序有什么用?

4

3 回答 3

26

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

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

从 C11 7.21.5.2 开始,fflush 函数fflush仅适用于输出/更新流,不适用于输入流。

如果 stream 指向未输入最近操作的输出流或更新流,则 fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。

于 2013-08-11T09:12:57.083 回答
11

它在读取之前清除stdin缓冲区。从手册

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

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

于 2013-08-11T09:12:22.307 回答
6

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

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 机器上进行了测试,但它不起作用。

于 2013-08-11T09:22:02.927 回答