《你的月亮我的C》(三):scanf 的那些事

1、用scanf("%d\n", &i);來輸入數字,要多輸入一行才返回,爲什麼?

輸入4之後,要多輸入一個換行和1,才能輸出4。

這是因爲,在scanf語句中“\n”不是表示換行符,而是表示讀取並放棄連續的空白字符。scanf語句中任何的空白字符都表示讀並放棄空白字符。例如在%d前的空白也會被放棄掉,所以在scanf格式串中不需要手動輸入顯式的空白字符。

所以,在scanf("%d\n", &i);的輸入中,輸入數字4後,直到找到下一個非空白字符爲止,否則會一直讀取並放棄空白的字符,所以你需要再輸入一個非空白字符給它,它纔會讀取結束然後給你輸出。

當然你也可以把%d後的\n去掉,這樣在輸入一個數字後回車立刻可以輸出。

2、我們都知道使scanf(%d, &i),可是爲什麼i前面要帶上“&”?

scanf的格式串裏,傳進去的參數其實是一個指針,所以scanf會把輸入的值寫入,傳入指針指向的位置。

但這裏有個特殊的地方是

這樣是可以的。

想scanf傳入一個數組時,數組總是以指針的方式傳入函數,所以無論在scanf裏,無論arr前加不加“&”,都是可以的。

3、scanf用%f不能輸出double類型的值?

這樣爲什麼不行?

在printf裏,%f可以輸出float和double類型的值。但scanf不同,scanf用%lf表示double類型,用%f表示float型。

即使如上圖編譯器沒有報錯且能運行,但d作爲double類型接收不了float類型傳入的值。

4、scanf輸入流的問題。

先用scanf輸入一個數字,然後用gets讀取一個字符串,按照這樣輸入:

4

just

可是輸出結果卻是:

gets()被跳過去了,爲什麼?

scanf能讀到輸入的數字4,但之後輸入的換行符被保留在了輸入流中,然後被gets()讀進去了,對於gets()來說相當於讀進去了一個空行,“just”字符串並沒有被讀進去。

但如果你輸入:4 just

則可以讀入“just”字符串到gets()中。

5、當scanf遇到非合法字符。

看下這樣一個程序:

看起來沒問題。

可是如果我這樣輸入:

結果會怎樣?

無限循環啦!

在scanf中,用%d舉例,如果輸入的值不是數字字符,都會被終止讀入並保留在輸入流中,scanf不會越過錯誤的非數字字符來處理後面的合法數字字符,所以在輸入流中永遠都會存在那個非數字字符,從而導致無限循環的出現。

至於證明scanf真的把非合法字符保留在了輸入流中,你可以這樣寫個代碼來證明:

假設%d中沒有把非合法字符”a”保存在了輸入流中,那麼%s讀入的應該是”bc”而不是”abc”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章