在输入流上使用 fflush

POSIX 和 C 标准明确声明在输入流上使用 fflush 是未定义的行为。fflush 仅针对输出流定义。

#include <stdio.h>

int main()
{
    int i;
    char input[4096];

    scanf("%i", &i);
    fflush(stdin); // <-- undefined behavior
    gets(input);

    return 0;
}

没有标准方法可以从输入流中丢弃未读字符。另一方面,一些实现使用 fflush 来清除 stdin 缓冲区。Microsoft 在输入流上定义了 fflush 的行为:如果流是打开输入的,则 fflush 清除缓冲区的内容。根据 POSIX.1-2008,除非输入文件是可搜索的,否则 fflush 的行为是未定义的。

有关更多详细信息,请参阅使用 fflush(stdin)