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”。