scanf 函式讀取型別不匹配問題

2021-07-25 16:31:00 字數 2348 閱讀 9819

一般情況下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函式讀入整數時,如果我們輸入的是乙個字元,那...