【发布时间】:2013-12-16 10:51:23
【问题描述】:
我正在(重新)学习 C 编程,所以以下问题是为了便于理解。 使用 scanf() 我了解到(或者我自己发现,到这一点并不需要很长时间)刷新标准输入是一件好事。我进一步发现(在你的帮助下) fflush(stdin) 不是标准的事情,例如不适用于 gcc。 我继续使用下面的代码 sn-p 来刷新标准输入。它是在这里提供的(谢谢)。如果标准输入不为空,它工作正常。但是,如果 stdin 为空,则它不起作用。我的刷新函数中的 fgetc() 只是等待并阻止程序。事实上,到目前为止我所知道的所有其他标准输入读取函数(scanf()、fgetc()、gets()、fgets()、getchar())都表现出相同的行为。所以我的刷新函数实际上是一个条件刷新:它只有在缓冲区不为空时才会刷新。如果它是空的,则刷新会阻塞程序并等待标准输入的输入。这不是我想要的。所以,我需要的是一种检查标准输入是否为空的方法。如果是我继续。如果不是,我运行我的冲洗功能。
所以,我正在寻找的是一种检查标准输入是否为空的 C 标准方法。
非常感谢您的帮助!
void flush_line(FILE *);
/* function to flush stdin in a C standard way since*/
/* fflush(stdin) has undefined behaviour. */
/* s. http://stackoverflow.com/questions/20081062/fflushstdin-does-not-work-compiled-with-gcc-in-cygwin-but-does-compiled-with-v */
void flush_line(FILE *fin)
{
int ch;
do
{
ch = fgetc(fin);
} while (ch != '\n' && ch != EOF);
}
【问题讨论】:
-
不幸的是,这可能效果不佳,因为如果没有要读取的字符,
fgetc会阻塞。 -
“刷新”输入流到底是什么意思?
-
冲洗我的意思是清空输入流,以确保那里没有不应该的东西,例如在要求用户输入并从标准输入读取此输入之前。
-
@CharlesBailey 可能是
consuming里面的所有剩余数据... -
哦,如果
fin是一个文件(而不是stdin),那么您无法知道实现是否继续连续缓冲,因此缓冲区可能永远不会清空。