為什麼連續的scanf會被跳過或不執行

2022-05-21 21:06:13 字數 1508 閱讀 9392

乙個很簡單的例子:

#include /*

試圖兩次利用scanf()函式,先後讀取整型變數a和字元型變數c

*/int

main()

解析:當我們輸入:123 ↙

會發現程式會「直接」列印整數123,好像並沒有給我們留下時間和空間輸入字元型變數c的值(一開始我也一臉懵b??).

但是,經過除錯(啊,萬能的除錯!),我們可以發現,其實整型變數c已經讀入了值『\n』,即ascii碼為10的字元——換行符;

如調試圖:

實際上:

函式scanf( )從標準輸入裝置(鍵盤) 讀取輸入的資訊,不會直接賦值給變數,而是先儲存到乙個緩衝區中;

當程式執行到函式scanf()時,程式會從緩衝區中讀取;

如果緩衝區是空的,才會停滯,游標閃爍,等待鍵盤的輸入.

值得注意的是,scanf()中格式字串裡:

-對於引數%d:會忽略緩衝區開頭的空白符(空格、回車、製表符等)(無論有幾個);

-對於引數 %c:直接讀取緩衝區的第乙個字元(無論這個字元是什麼);

故,上例中:

1º 向緩衝區中輸入:123\n

2º 語句scanf("%d",&a); 讀取走了123,賦給變數a;

(緩衝區變化:123\n → \n)

3º 語句scanf("%c",&c);讀取走了**\n,賦給變數c**;

(緩衝區變化:\n → 空白)

解決方法:

1º 利用函式getchar( )吃掉回車:在scanf後接乙個getchar( );

#include int

main()

2º 利用函式fflush( )清除緩衝區:如fflush(stdin);

#include int

main()

注意 注意 注意 :

有同學可能用的是新版的vs,可能不支援該方法2;可以試一下替換成rewind(stdin)函式;

或者可以直接一次性讀取兩個資料scanf("%d%*c", &c);——注意星號*哈!

這句話的意思是就是說:讀取乙個整數後,丟棄緊跟在整數後邊的乙個字元(也就是我們多輸入的「回車符」);

有問題的試一下吧…

——在函式scanf( )的格式字串中加入\n的問題:

#include int

main()

這種情況下,按照「整型數字 回車」的格式讀取,讀到回車之後,由於緩衝區空白,程式停滯,程式停滯,游標閃爍,等待鍵盤輸入;故,當你輸入乙個整數和回車後,a的值不會立即列印,要等再接收到乙個非空白符(即非空格、回車、製表符等)的輸入之後,該scanf語句才結束,接著才輸出。

如圖:解釋:當輸入:123↙ 程式框中換行但並不列印;

繼續輸入:456↙ 此時換行,並且輸出了剛才鍵入的123;

總之,在使用函式scanf( )時,應該心中有乙個緩衝區,合理利用相關函式來解決鍵盤緩衝區殘餘資訊的問題;同時,理解讀取格式,以便搞清楚何時函式scanf( )結束;

連續scanf輸入字元型資料時,出現跳過輸入問題

例 include main 通過新增fflush stdin 來清空鍵盤緩衝區。include main 或者通過新增getchar 來臨時接收回車enter include main 總結 sacnf函式接收輸入資料時,遇見以下三種情況結束乙個資料當輸入 遇空格,回車,跳格鍵 遇寬度格式修飾符 ...

var 為什麼會被let const 替代

1.變數提公升是指在子塊中定義的變數,在某些特殊情況下 比如說上文提到的for迴圈就是乙個子塊 其作用域擴大到了父塊的範圍內 dosomething是乙個父塊 有些文章也會把他稱作 變數洩漏 是乙個概念。2.var定義變數的作用域是函式作用域,並非塊級作用域 es5沒有塊級作用域的概念 變數是很容易...

scanf是什麼意思,為什麼scanf前加

scanf函式返回成功讀入的資料項數,讀入資料時遇到了 檔案結束 則返回eof。scanf d d a,b 函式返回值為int型。如果a和b都被成功讀入,那麼scanf的返回值就是2 如果只有a被成功讀入,返回值為1 如果a和b都未被成功讀入,返回值為0 如果遇到錯誤或遇到end of file,返...