C語言中scanf函式與輸入緩衝區

2021-07-23 23:01:25 字數 1775 閱讀 6025

樣例**於演算法競賽入門經典第一章實驗部分的內容,經過測試發現scanf函式對於整形資料在讀入時會過濾掉 空格符 、換行符 和 水平製表符。按照提示,如果b的值非法,比如說輸入乙個字元『s』,那麼會出現什麼結果呢?

void scanf_buffer(void)

phase_1:輸入的兩個數均為合法的int型的整數,可以觀察到scanf函式對於整形的讀入過濾了回車符、換行符、水平製表符。第一階段的實驗結果明確。

scanf函式有點意思的,scanf函式會對整形、浮點型和字元陣列(字元型指標)過濾掉空格、回車符和水平製表符,對於字元型則按照讀入的字元處理。scanf函式按照字元流的形式讀取外部輸入裝置中的字元流,在本例中,過濾結束之後,還需要將字元流「1234」轉化為整形1234,字元流「3.14」轉化為float型的3.14等。

上面兩圖模擬了乙個意欲順序讀入int,float,double型值的一次成功的讀取過程。首先scanf函式成功得到了想要的資料,並返回了成功得到的資料的個數。簡化邏輯,keyboard中的資料以中斷觸發的形式被讀入,經過一系列的傳遞,交付給了系統的輸入緩衝區(這時keyboard中已經沒有了資料),然後scanf代表的user通過系統呼叫成功取走了input buffer中的資料(input buffer中資料都被取走,input buffer為空),然後scanf函式返回值為3,ret = 3。

如果正常讀取的話,也真的不好再說什麼了(人家都按照你的意願達到了你想要的結果,你還想怎樣),下面通過一組資料,深入了解一下輸入緩衝區。

1、從邏輯上說,輸入緩衝區從標準輸入或者是檔案中得到資料,然後等待被應用程序取走。其必要性是為了匹配低速的輸入裝置與高速的cpu之間的不均衡性,從而提高系統效能。

2、為什麼非法輸入的時候,資料被卡在input buffer而不是其他地方?

注意,過程1只是簡單地資料傳輸,不涉及型別檢查,而過程2需要根據scanf函式的格式檢查值是否合法,所以問題只可能出在過程2。

3、這一點比較隱晦,如圖的三個變數輸入的時候,scanf依然是有返回值的。鑑於scanf函式在處理時候的強次序性,scanf函式返回0代表第乙個值已經非法,後面的值合法與否都不在重要了,因為越不過去第乙個值;scanf函式返回1代表第乙個值合法,第二個值非法,依此類推,直到scanf函式返回3意味著這一輪的資料已經讀取完畢,可以進行下一輪的資料讀入。

方法1:讀入的時候順帶檢查scanf函式的返回值是否異常,異常也可及時退出,不會一直占用input bufffer

void scanf_buffer()

方法2:fflush(stdin)強制重新整理input bufffer,保證輸入結果的無後效性。及時偶爾的非法輸入也不會使程式陷入死迴圈或直接退出的問題。

void scanf_buffer()

}

總結:上述兩種方法均可處理scanf異常讀入的情況均可以,視不同的情景要求使用。方法2的魯棒性明顯顯得好得多,fflush(stdin)也很有意思,就這樣。

C語言中的Scanf輸入函式

1 問題描述 c語言中的scanf函式如果讀取到正確的值,也就是和scanf函式中提前設定的值的型別一致時,該值可以正確被讀入。並且scanf函式的返回值是1,通過對scanf函式的返回值的判斷就可以知道scanf函式是否讀入了正確的值。2 程式 本次使用的編譯器是vscode,測試程式是乙個把華氏...

C語言中scanf函式

scanf 函式每次讀取乙個字元,跳過所有的空白字元,直至遇到第1個非空白字元才開始讀取。因為要讀取整數,所以 scanf 希望發現乙個數字字元或者乙個符號 或 如果找到乙個數字或符號,它便儲存該字元,並讀取下乙個字元。如果下乙個字元是數字,它便儲存該數字並讀取下乙個字元。scanf 不斷地讀取和儲...

C語言中正確使用輸入函式scanf

c語言中輸入函式scanf使用不當,會出現各種錯誤,正確使用,會提高效率,現把一些注意事項,正確的使用方法和經驗分享給大家.在c語言中空白字元括 空格 換行 n 回車 r 水平製表符 t 換頁符 f 垂直製表符 v 在scanf讀取的乙個引數是數時,開始輸入的空白字元會被忽略,讀取數字直到遇到第一字...