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

时间:2013-11-30 10:54:12

标签: c stdin flush

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

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

}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

这是:

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

答案 2 :(得分:0)

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

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

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