📜  在C中使用fflush(stdin)

📅  最后修改于: 2021-05-25 19:23:26             🧑  作者: Mango

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

fflush(FILE *ostream);

ostream points to an output stream 
or an update stream in which the 
most recent operation was not input, 
the fflush function causes any 
unwritten data for that stream to 
be delivered to the host environment 
to be written to the file; otherwise, 
the behavior is undefined.

我们可以将其用于stdin之类的输入流吗?
根据C标准,使用fflush(stdin)是未定义的行为。但是,某些编译器(例如Microsoft Visual Studio)允许它允许。在这些编译器中如何使用它们?当使用带空格的输入字符串时,不会为下一个输入清除缓冲区,而是将前一个输入视为相同。为了解决这个问题,fflush(stdin)是。用于清除流/缓冲区。

// C program to illustrate situation
// where flush(stdin) is required only
// in certain compilers.
#include 
#include
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;
}

输入:

geeks   
geeksforgeeks

输出:

geeks 
geeks 

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

// C program to illustrate flush(stdin)
// This program works as expected only
// in certain compilers like Microsoft
// visual studio.
#include 
#include
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;
} 

输入:

geeks
geeksforgeeks

输出:

geeks 
geeksforgeeks

使用fflush(stdin)很好吗?

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

参考:
https://stackoverflow.com/questions/2979209/using-fflushstdin

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。