fflush()通常仅用于输出流。其目的是清除(或刷新)输出缓冲区并将缓冲的数据移动到控制台(在stdout的情况下)或磁盘(在文件输出流的情况下)。下面是它的语法。

fflush(FILE * ostream);

ostream指向输出流 
或其中的更新流 
最近的操作没有输入, 
fflush功能会导致任何问题 
该流的未写入数据 
被送到主机环境 
写入文件; 除此以外,
行为未定义。

我们可以将它用作stdin等输入流吗?
根据C标准,使用fflush(stdin)是未定义的行为。然而,像微软的vs一些编译器允许它。在这些编译器中如何使用它们?在使用带空格的输入字符串时,缓冲区不会被清除以用于下一个输入,并将前一个输入视为相同。要解决这个问题fflush(stdin)是。用于清除流/缓冲区。

// C program to illustrate situation
// where flush(stdin) is required only
// in certain compilers.
#include <stdio.h>
#include<stdlib.h>
int main()
{
    char str[20];
    int i;
    for (i=0; i<2; i++)
    {
        scanf("%[^\n]s", str);
        printf("%s\n", str);
        // fflush(stdin);
    }
    return 0;
}

输入:

怪才   
geeksforgeeks

输出:

怪才 
怪才 

上面的代码只接受单个输入,并为第二个输入提供相同的结果。原因是因为字符串已经存储在缓冲区中,即流尚未被清除,因为它期望带有空格或新行的字符串。因此,为了处理这种情况,使用了fflush(stdin)。

// C program to illustrate flush(stdin)
// This program works as expected only
// in certain compilers like Microsoft
// visual studio.
#include <stdio.h>
#include<stdlib.h>
int main()
{
    char str[20];
    int i;
    for (i = 0; i<2; i++)
    {
        scanf("%[^\n]s", str);
        printf("%s\n", str);
        // used to clear the buffer
        // and accept the next string
        fflush(stdin);
    }
    return 0;
}

输入:

怪才
geeksforgeeks

输出:

怪才 
geeksforgeeks

使用fflush(stdin)好吗?

虽然在“scanf()”语句之后使用“fflush(stdin)”也会清除某些编译器中的输入缓冲区,但建议不要使用它,因为它是语言标准的未定义行为。在C和C ++,我们有不同的方法来清除在此讨论的缓冲后。

在C中使用fflush(stdin)-IDC帮帮忙