C語言篇 3 緩衝區問題

2022-08-03 09:15:13 字數 1781 閱讀 9844

鍵盤—》鍵盤緩衝區—》輸入緩衝區—》程式(scanf函式)

我們在鍵盤上輸入的任何東西,會先進入輸入緩衝區區域,然後程式從輸入緩衝區裡把資料乙個乙個讀出來。

輸入緩衝區的管理方式:

先進入的數字會被先讀出來(輸入緩衝區裡把前面的數字讀走了,才能讀後面的數字)

scanf就是從輸入緩衝區裡拿數字,如果輸入緩衝區的內容和scanf指定的格式型別不一樣,它就不動,不會把輸入緩衝區裡的任何內容轉移走。

所以你用scanf讀乙個%d,輸入緩衝區輸入乙個[a10],用scanf讀取乙個整數的時候,它讀出來的a發現不是乙個整數,它又把這個a放回去了。

下回再讀,還是讀的這個a。a始終堵在緩衝區內,後面的資料10讀不到。

為了解決這個問題,我們在每次讀取乙個資料後,把輸入緩衝區裡的資料全清理掉,我不管裡面有什麼,我這次讀完了過後也不管這次是讀到還是沒讀到,反正我這次讀完了過後把輸入緩衝區全部清理掉,這樣的話我保證你下一次讀的時候是乙個新的開始。

每次讀完乙個資料後,把輸入緩衝區裡的資料全部清理掉,保證下一次再讀的時候一定是乙個新的開始,這樣就不會因為前一次的錯誤導致後一次出問題。【清理輸入緩衝區的目的:前面的輸入出錯了,保證不會影響後面的輸入】

每次讀完乙個資料後清理輸入緩衝區,保證前面的輸入出錯了,不會影響後面的輸入

scanf("%*[^\n]");

scanf("%*c");

輸入緩衝區有這樣的乙個特點:只有當其中的資料讀走的時候,才會清除這個資料。

scanf(資料型別)和緩衝區中的資料型別不一致的時候,便無法讀走資料,可能會導致死迴圈。

解決上面問題的辦法:

scanf("%*[^\n]");//*忽略讀到的內容,[^\n]任何非\n的字元;將\n之前的所有字元讀走

scanf("%*c");//從緩衝區讀取乙個字元忽略掉

補充:scanf呼叫失敗(主要原因:型別不匹配)返回垃圾值。

charch;

//下面兩行可以完全請空緩衝區中的一行內容

scanf("%*[^\n]");//先將換行符之前的所有內容都清掉

scanf("%c", &ch);//再將\n從輸入緩衝區讀走

scanf如果發現輸入緩衝區中沒有東西,就啟動錄入

scanf發現輸入緩衝區中有\n,那麼他就會去輸入緩衝區取值

如果發現是自己的菜就會取走放到自己盤子裡

如果不是自己的菜,就會自己回去了

//檢查輸入格式是否正確

#include

int main()

printf("輸入正確!num=%d\n",num);

每次使用

scanf函式讀資料後都需要清理輸入緩衝區!

程式(printf函式)->輸出緩衝區->螢幕

程式的輸出可以到達螢幕的條件

輸出緩衝區內容顯示在螢幕上的條件(至少滿足乙個):

遇到\n

程式結束(函式結束)

輸出緩衝區滿了

使用fflush(stdout)強制重新整理(人工重新整理)

C語言 清空緩衝區

考慮到下面的 includeint main while n 1 return 0 就是輸入乙個數,然後輸出這個數,如果輸入 1 就表示結束。但是如果使用者不小心輸入了乙個字母 或者其他非數字字元,就會發生死迴圈,這是為什麼呢?這是因為scanf函式是從緩衝區讀取乙個指定格式的變數。並且返回成功讀入...

C語言鍵盤輸入緩衝區問題

1 include 2 3int main 1819 printf 輸入正確!num d n num 2021 return0 2223 參考 1 include 2 3int main void 4 17 沒有發生錯誤,清空輸入流。18 通過 while 迴圈把輸入流中的餘留資料 吃 掉 19 w...

C語言清除輸入緩衝區

在使用scanf輸入時,如果輸入不合法,此時可以檢查其返回值為0,但下次再呼叫時,上次不合法的輸入,還在輸入緩衝區中,此時就會接著不合法,如下 include int main int argc,char argv printf you input is d n id return 0 這樣,如果輸...