我正在重新学习C编程,因此下面的问题是为了更好地理解。
使用scanf(),我发现清空stdin很重要(或者自己找到这个方法也不会花费太长时间)。我通过你的帮助进一步了解到,fflush(stdin)不是标准化的,例如gcc就不支持该函数。
我开始使用以下代码段来清空stdin。感谢这里提供的代码段,如果stdin非空,则它能正常工作。但是,如果stdin为空,则它将无法工作。我的清空函数中的fgetc()只是等待并阻止程序。事实上,到目前为止我所知道的所有其他stdin读取函数(如scanf()、fgetc()、gets()、fgets()、getchar())都表现出相同的行为。因此,我的清空函数实际上是有条件的清空:只有在缓冲区非空时才进行清空。如果为空,清空操作将阻塞程序并等待从stdin接收输入。这不是我想要的。因此,我需要一种方法来检查stdin是否为空。如果为空,则继续执行。如果不为空,则运行我的清空函数。
因此,我正在寻找的是一种C标准方法来检查stdin是否为空。
非常感谢您的帮助!
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
会在没有字符可读时阻塞。 - Some programmer dude消耗
其中的所有剩余数据... - A4Lfin
是一个文件(而不是stdin
),那么你就无法知道实现是否继续连续缓冲,因此缓冲区可能永远不会清空。 - Some programmer dude