替代C库函数fflush(stdin)
任何人都可以解释如何解释以下代码,我真的不明白。
while((c = getchar()) != '\n' && c != EOF);
我知道它用于刷新输入流,并且可以用标准C库函数替换:
fflush(stdin)
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()
会丢弃从底层文件中提取但尚未被应用程序使用的任何缓冲数据。
这与丢弃输入到行尾不一样。 使用它会使您的代码不可移植。
假设文件(或其他一些输入)已打开,此代码将继续按字符逐个获取,直到找到换行符(\ n)或文件结尾(eof)。
fflush将清除流文件以打开文件。