今日总结 – 基础知识 | 每日一面(85)

读者:如何清除多余的输入, 以防止在下一个提示符下读入?fflush(stdin)可以吗?

小林:fflush() 仅对输出流有效。因为它对 “flush” 的定义是用于完成缓冲字符的写入, 而对于输入流 fflush 并不是用于放弃剩余的输入。

读者:既然 fflush() 不能, 那么怎样才能清除输入呢?

小林:这取决于你要做什么。如果你希望丢掉调用 scanf()之后所剩下的换行符和未预知的输入, 你可能需要重写你的 scanf() 或者换掉它。或者你可以用下边这样的代码吃掉一行中多余的字符

while((c = getchar()) != ’\n’ && c != EOF)

/* 丢弃 */ ;

你也可以使用 curses 的 flushinp() 函数。没有什么标准的办法可以丢弃标准输入流的未读取字符, 即使有, 那也不够,因为未读取字符也可能来自其它的操作系统级的输入缓冲区。如果你希望严格丢弃多输入的字符 (可能是预测发出临界提示), 你可能需要使用系统相关的技术。

有时候,正是那些意想不到之人,成就了无人能成之事。

正文完