为什么fflush(stdin)不会删除缓冲区(stdin)

我有这样的测试代码

#include  #include  #include  int main() { char c, str[20]; printf("Enter a character : "); scanf("%c", &c); printf("Enter a string : "); fflush(stdin); gets(str); printf("\n\n\nResult : %c\n%s\n", c, str); return 0; } 

我读过一些文章说这个代码会起作用,因为在扫描c字符后,缓冲区中仍然有’\ n’字符。 fflush(stdin)将清除缓冲区,因此gets()函数可以正常工作

但事实上,当我在Mac OS环境中编译并运行此代码时,fflush(stdin)什么都不做。 我输入了一个字符(例如’k’),然后打印出k字符和’\ n’字符。 它假设允许我输入一个字符,一个字符串,然后打印它们。 谁知道为什么? 谢谢!

fflush(3)被记录为处理输出流,而不是输入流。

标准未指定输入流的行为。

特别是fflush POSIX规范没有提到输入流。 因此,从POSIX的角度来看,这可能是一种未定义的行为 。

但是,在Linux上, fflush(stdin)是可能的(但我不推荐它)

对于输入流,fflush()会丢弃从底层文件中提取但尚未被应用程序使用的任何缓冲数据。

BTW, gets(3)因为危险 (可能的缓冲区溢出 !)而被弃用 ,并且已经从C11标准中消失了。 至少使用fgets(3)和最好使用getline(3) 。 也许考虑GNU readline库(它提供了很好的编辑能力)。

因为fflush(stdin)undefined behavior

fflush()函数仅用于streams open for output ,而不是输入。 这种方法似乎适用于某些C编译器,但完全不可移植! 因此,不应该使用它。