问如果fflush不起作用,我能用什么来刷新输入?
答这取决于你想做什么。如果你想在调用scanf(参见问题 12.18a-12.19)后丢弃未读取的换行符或其他意外输入,你确实需要重写或替换对scanf(参见问题 12.20)的调用。另外,你可以使用一个简单的代码片段来消耗部分读取行的剩余部分,如下所示:
while((c = getchar()) != '\n' && c != EOF) /* discard */ ;
(你也可以使用 curses 的flushinp函数。)
没有标准的方法可以丢弃 stdio 输入流中的未读取字符。有些供应商确实实现了fflushfflush(stdin)以丢弃未读取的字符,尽管可移植的程序不能依赖于此。(stdio 库的某些版本实现了fpurge和或fabort调用,它们做同样的事情,但这些也不是标准的。)另外请注意,刷新 stdio 输入缓冲区并非总是足够的:未读取的字符也可能累积在其他操作系统级别的输入缓冲区中。如果你想主动丢弃输入(也许是为了响应一个意外的提示,以确认一个破坏性操作,此时意外输入的“y”可能会造成灾难性的后果),你将不得不使用特定于系统的技术来检测预输入的存在;参见问题 19.1 和 19.2。请记住,如果你丢弃了用户不小心过快输入的字符,用户可能会感到沮丧。
参考文献:ISO Sec. 7.9.5.2
H&S 第 15.2 节