鍵盤—》鍵盤緩衝區—》輸入緩衝區—》程式(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 這樣,如果輸...