替代 C 库函数 fflush(stdin)

Bjö*_*röm 1 c

任何人都可以解释如何解释以下代码,我真的不明白。

while((c = getchar()) != '\n' && c != EOF);
Run Code Online (Sandbox Code Playgroud)

我知道它用于刷新输入流,并且可以用标准 C 库函数替换它:

fflush(stdin)
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 5

while((c = getchar()) != '\n' && c != EOF);
Run Code Online (Sandbox Code Playgroud)

这会读取输入字符,直到它到达行尾(即,getchar()返回'\n)或文件结尾或错误条件(即,getchar()返回EOF)。

如果stdin正在从键盘读取,它会放弃输入,直到您按 Enter。

EOF如果出现输入错误或触发文件结束条件(在 Unix 上,通过键入Ctrl-D两次),则不进行检查可能会给您带来无限循环。

这可能很有用,例如,在scanf()用于读取整数之后。如果您执行scanf("%d", &num);并键入123,它将读取这 3 位数字(并将值存储在123n),但之后的所有内容都将等待读取。上面的行可用于跳过输入行的其余部分。

(另一种可能更好的替代方法是使用 读取整行fgets()并使用解析它们sscanf()。)

等同于fflush(stdin). 就 C 标准而言,调用fflush输入流具有未定义的行为。

一些实现确实定义了fflush(stdin). 例如,在使用 GNU libc 的系统上(大多数 Linux 系统):

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

这与丢弃直到行尾的输入不同。使用它会使您的代码不可移植。