替代C库函数fflush(stdin)

时间:2013-10-06 07:13:33

标签: c

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

while((c = getchar()) != '\n' && c != EOF);

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

fflush(stdin)

2 个答案:

答案 0 :(得分:4)

while((c = getchar()) != '\n' && c != EOF);

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

如果正在从键盘读取stdin,则会在您按Enter键之前丢弃输入。

如果出现输入错误,或者触发文件结束条件(在Unix上,键入 Ctrl-D EOF检查可能会给你一个无限循环>两次)。

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

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

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

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

  

对于输入流,fflush()会丢弃所有缓冲数据   已从底层文件中获取,但尚未被使用   申请。

这与丢弃输入到行尾不一样。使用它会使您的代码无法移植。

答案 1 :(得分:1)

假设文件(或其他一些输入)已被打开,此代码将继续按字符逐个获取,直到找到换行符(\ n)或文件结尾(eof)。

fflush只会清除打开文件的流。