【发布时间】:2016-08-11 10:21:58
【问题描述】:
我已经阅读了大约 5-10 条关于如何清除标准输入的不同建议,但没有一个适合我的需要。问题是fflush(stdin) 在我的电脑上运行良好,但不幸的是它似乎并不能在任何地方运行,所以我需要具有相同功能的东西。我尝试过的所有其他方式都会在标准输入不为空时清除它,但在标准输入为空时需要用户输入,这意味着它需要在我不想得到任何输入的时刻输入(+ 它无论如何都会丢弃它)。
问题是:在我要求用户输入之前,我能否以某种方式确保 stdin 为空? (如果不是,那么然后才以某种方式清除它?)
类似于:
if (stdin is NOT empty)
while (getchar() != '\n')
continue;
编辑:问题是我从stdin 一个接一个地加载字符,在某些时候,前一次迭代的一部分输入可能会或可能不会被丢弃。无论哪种方式,在我要求用户处理另一个输入之前,我都需要明确 stdin。清除缓冲区本身并不是什么大问题,问题是当程序到达清除stdin 时输入为空时会发生什么,因为在那一刻程序需要另一个输入,它将被吃掉清算功能。这就是我想要摆脱的。 (当我可以使用fflush(stdin); 时,我只知道,对于我的程序的下一行,stdin 无论如何都将为空,不问任何问题......)
【问题讨论】:
-
fflush(stdin)是 UB。 -
不存在空I/O流,它是流。考虑:
./myprog </dev/random;它会看到其标准输入流的结尾吗? -
在windows上编程,必须在linux下工作...
-
您是否也想刷新任何部分输入的输入行(即用户尚未输入 ENTER 提交的输入)?
-
@Jens
apt-get程序故意这样做。见Prevent sudo, apt-get, etc. from swallowing pasted input to STDIN