3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
scanf
scanf
scanf
gets
scanf
gets
: scanf
gets
scanf
printf
scanf
scanf
scanf
scanf
scanf
strto...
scanf
scanf
fscanf
sscanf
scanf

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
scanf
有很多問題-見問題 12.17,12.18 a ,和 12.19..另外, %s
格式也有同樣的問題 gets()
有(見問題) 12.23很難保證接收緩沖區(qū)不會(huì)溢出。 [腳注]
更廣泛地說, scanf
是為相對(duì)結(jié)構(gòu)化的格式化輸入設(shè)計(jì)的(它的名稱實(shí)際上是從“掃描格式化”派生出來的)。如果你注意,它會(huì)告訴你它是成功的還是失敗的,但它只能告訴你它是在哪里失敗的,而根本不知道它是如何或?yàn)槭裁词〉?。您幾乎沒有機(jī)會(huì)進(jìn)行任何錯(cuò)誤恢復(fù)。
然而,交互式用戶輸入是最不結(jié)構(gòu)化的輸入。一個(gè)設(shè)計(jì)良好的用戶界面將允許用戶輸入幾乎任何東西-不僅僅是字母或標(biāo)點(diǎn)符號(hào)(當(dāng)數(shù)字被期望時(shí)),而且比預(yù)期的字符更多或更少,或者根本沒有字符( E.,只是返回鍵),或過早的EOF,或任何東西。當(dāng)使用 scanf
;讀整行要容易得多(用 fgets
),然后用 sscanf
或者其他一些技巧。(功能如 strtol
,strtok
,和 atoi
通常是有用的;參見 12.16和 13.6)如果你真的使用任何 scanf
變量,請(qǐng)確保檢查返回值,以確保找到了預(yù)期的項(xiàng)目數(shù)。另外,如果你用 %s
,確保防止緩沖區(qū)溢出。
請(qǐng)注意,順便說一句,對(duì).的批評(píng) scanf
不一定要起訴 fscanf
和 sscanf
.scanf
讀自 stdin
,這通常是一個(gè)交互式鍵盤,因此是最小的限制,導(dǎo)致最多的問題。另一方面,當(dāng)數(shù)據(jù)文件具有已知的格式時(shí),使用 fscanf
..使用 sscanf
(只要檢查了返回值),因?yàn)榛謴?fù)控制非常容易,所以重新啟動(dòng)掃描,如果不匹配則丟棄輸入,等等。
其他鏈接:
參考文獻(xiàn):K&R2,SEC.7.4第159頁
- 3 回答
- 0 關(guān)注
- 418 瀏覽
添加回答
舉報(bào)