如何在C中检查stdin是否为空

我(重新)学习C编程,所以下面的问题是为了理解。 使用scanf()我学会了(或者我自己发现,实际上并不需要很长时间才能达到这一点),冲洗stdin是一件好事。 我进一步发现(在你的帮助下)fflush(stdin)不是标准的事情,例如与gcc不兼容。 我继续使用下面的代码片段来刷新stdin。 它在这里提供(谢谢)。 如果stdin不为空,它工作正常。 然而,如果stdin是空的,它就不起作用。 我的刷新函数中的fgetc()只是等待并阻止程序。 事实上,到目前为止我所知道的所有其他stdin读取函数(scanf(),fgetc(),gets(),fgets(),getchar())都表现出相同的行为。 所以我的刷新函数实际上是一个条件刷新:它只在缓冲区不为空时才刷新。 如果它为空,则刷新阻塞程序并等待stdin的输入。 这不是我想要的。 所以,我需要的是检查stdin是否为空的方法。 如果是我继续。 如果不是我运行我的冲洗function。

所以,我正在寻找的是一种检查标准输入是否为空的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); } 

您可以使用select或poll来检查文件描述符是否可读。 但不是ANSI C.

我以癌症的方式解决了这个问题,但效果很好。 如果仅在stdin为脏(非空)时起作用,那么在清除它之前,只需将\n发送到stdin。 是的,我知道,这似乎是一个非常难看的解决方案,但这是我认为可移植的唯一理智方式,因为select或poll不适用于Windows)。

这是:

 void flush_stdin() { char c; ungetc('\n', stdin); // ensure that stdin is always dirty while(((c = getchar()) != '\n') && (c != EOF)); } 

不要将stdin视为数据可用或不可用的地方。 它被称为是有原因的:只要可能的话,你总是对它的下一个数据感兴趣。

具体地说,你决定“刷新”(可能“排干”将是一个更好的词)流是有原因的 。 也许您从用户请求了一个整数,而是输入了字母。 那么,你知道流不是“空”,因为它中有字母! 所以阅读到下一个换行符是一个合理的想法。

或者(为了与其他一些实用程序兼容?)你有一个协议,其中某一行输入是无关紧要的。 然后你可以“排干”那条线; 用户是否输入了任何内容并不重要,因为您必须等到他们输入它之后才能接受来自他们的任何更多输入。