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

标签 c stdin flush

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

所以,我正在寻找的是一种检查 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);

}

最佳答案

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

具体来说,您出于原因决定“冲洗”(也许“耗尽”这个词更合适)流。也许您向用户请求了一个整数,但他们却输入了字母。那么,您知道流不是“空的”,因为其中有字母!所以一直读到下一个换行符是一个合理的想法。

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

关于c - 如何检查stdin在C中是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20299348/

相关文章:

c - 如何在 GUI 窗口中创建 C 程序?

c - 使用 char ** 指针的字符串操作代码给出了意外的结果

linux - linux下AT命令重定向到microcom命令

c - 如何使用 VC++ 编译器刷新 .C 程序中的标准输入设备?

c - printf ("%d",scanf ("ABC")); 的输出是什么?

c - 在 C 中将 double 值与 EPSILON 进行比较的精度

Java BufferedOutputStream.flush() 不刷新

python - 使用 python 记录文件和进程超时的输出

c - popen 没有按预期工作

bash - 在程序开始时读取所有 stdin 会阻止在程序期间从 stdin 读取