一般情況下scanf("%d",&num)會讀取乙個字元,如果該字元是數字,它便儲存該數字並讀取下乙個字元,知道遇到第乙個空白字元為止。或者遇到非數字字元,它也會停止讀入,然後scanf()函式把非數字字元放回輸入。這意味著在改程式下一次讀入時,首先讀取到的是上一次丟棄的非數字字元。
在linux系統下,如果scanf()函式使用的是%d轉換說明符,那麼當程式讀取的第乙個字元為非數字字元比如『a』時,scanf()將會停留在那裡,並把字元『a』放回輸入,然後繼續讀取,scanf()一直無法越過a讀到下乙個字元,一直反覆讀入,並陷入死迴圈。
下面就是程式**和示例(linux系統在命令列模式下執行的結果):
#include
#define sec_per_min 60
int main(void)
printf("done!\n");
return 0;}
(以上**選自c primer plus)
在linux命令列執行結果如下所示:
$ ./min_sec
convert seconds to minutes and seconds!
enter the number of seconds (<=0 to quit):
3030 seconds is 0 minutes,30 seconds.
enter next value (<=0 to quit):
2020 seconds is 0 minutes,20 seconds.
enter next value (<=0 to quit):
7070 seconds is 1 minutes,10 seconds.
當我輸入字元q時:
enter next value (<=0 to quit):
q70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
70 seconds is 1 minutes,10 seconds.
enter next value (<=0 to quit):
^z[2]+ 已停止 ./min_sec
程式就會陷入死迴圈,並且執行的值是上一次的值(因為sec賦值失敗,並且保留的是上一次所讀入的值),我按下ctrl+z強行終止程序。
當然,輸入小於零的數就會退出迴圈並終止程式,o(∩_∩)o。
scanf 函式的引數輸入型別不匹配問題
scanf 函式的引數輸入型別不匹配問題 這是我在csdn論壇上見到的問題,這個錯誤有時候會讓人莫名其妙。include main 當輸入a 回車 後,會直接跳過下面 個scanf語句,直接輸出為 123 t 原因 對於scanf d c a,c scanf語句執行時,首先試圖從緩衝區中讀入乙個 d...
scanf函式的讀取
scanf 以刪除的方式從緩衝區讀取資料 輸入裝置的資料儲存緩衝區,比如鍵盤 也就是說,scanf從緩衝區讀入乙個資料項,該資料項在緩衝區中就被清除掉了。而如果scanf需要讀取乙個資料項,返現緩衝區當前是空的,那麼程式就會在scanf 處阻塞,等待使用者輸入,scanf函式接收到相應的資料項之後,...
scanf和cin輸入型別不匹配時造成的死迴圈問題
下面兩段 要實現的功能是往整數變數i中輸入乙個資料,輸入數字1時退出,然而當輸入乙個字元時,整個程式會變成乙個死迴圈。c int i 0 while i 1 c語言 int i 0 while i 1 原因 造成死迴圈的原因也很簡單,當第一次通過scanf函式讀入整數時,如果我們輸入的是乙個字元,那...