13.18 為什麼大家都說不要使用 scanf()?那我該用什麼來代替呢?

scanf() 有很多問題 --- 參見問題 12.15, 12.16 和  12.17。而且, 它的 %s 格式有著和 gets() 一樣的問題 (參見問題  12.20) --- 很難保證接收緩衝不溢出。

更一般地講, scanf() 的設計使用於相對結構化的, 格式整齊的輸入。設計上, 它的名稱就是來自於 ``scan formatted"。如果你注意到, 它會告訴你成功或 失敗, 但它只能提供失敗的大略位置, 至於失敗的原因, 就無從得知了。 對 scanf() 多得體的錯誤恢復幾乎是不可能的; 通常先用類似 fgets() 的函數 讀入整行, 然後再用 sscanf() 或其它技術解釋。strtol(), strtok() 和 atoi()  等函數通常有用; 參見問題 13.4。如果你真的要用任何 scanf 的變體, 你要確保檢查返回值, 以確定找到了期待的值。而使用 %s 格式的時候, 一定要 小心緩衝區溢出。

參考資料: [K&R2, Sec. 7.4 p. 159]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)