13.17 我发现如果坚持检查返回值以确保用户输入的是我期待的数值, 则 scanf() 的使用会安全很多, 但有的时候好像会陷入无限循环。

在 scanf() 转换数字的时候, 它遇到的任何非数字字符都会终止转换 并被保留在输入流中。因此, 除非采用了其它的步骤, 那么未预料到的 非数字输入会不断 ``阻塞" scanf(): scanf() 永远都不能越过错误的非数字字 符而处理后边的合法数字字符。如果用户在数字格式的 scanf 如 %d 或 %f  中输入字符 `x', 那么提示后并用同样的 scanf() 调用重试的代码会立即遇到 同一个 'x'。

参见问题 12.18

参考资料: [ISO, Sec. 7.9.6.2]; [H&S, Sec. 15.8 pp. 357-64]。

翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)