1. 程式人生 > 其它 >C語言判斷scanf輸入的是否為整型,以及由此造成死迴圈的解決辦法

C語言判斷scanf輸入的是否為整型,以及由此造成死迴圈的解決辦法

技術標籤:實戰經驗c語言

aaaaaa第三篇趕上!

判斷scanf輸入的是否為整型

# 需求
很多時候我們需要用scanf輸入資料,但人為輸入的資料可能不符合指定的型別,自然地我們想到了判斷輸入型別是否正確。

# 實現
那該怎麼實現呢?這裡我們可以利用scanf的返回值:
scanf返回值:返回成功讀入的資料項數

既然這樣,那隻需要加一個迴圈,每次檢測錄入的資料項數是否為全部資料的個數,不是則說明有內容沒有錄取到(即出現非法字元),此時可以輸出提示要求重新輸入。

自然地我們寫出以下程式碼:

//以檢查輸入的是否一個整型為例(VS2019)
int n;
while (scanf_s("%d"
, &n) == 0) { printf("輸入了非法字元!\n"); }

!!但是,問題出現了
輸入非法字元後,結果是這樣的:
啊這,發生了甚麼?!

可以看到,while變成死迴圈了,並沒有給我們再次輸入的機會QAQ,到底發生了甚麼?!

# 分析
這時候就需要看看scanf的運作原理了
當要求的型別與輸入的型別不符合時,scanf會選擇直接跳過不接收該輸入,注意只是不接收,也就是說快取區中輸入的東西既沒被接收也沒有被清除,就這麼留在那裡。

那問題就來了,當下一次使用者要輸入時,scanf看到快取區有東西,就直接去讀取了,結果又讀到與指定型別不符合的,又跳過了,由此觸發了無限迴圈(傻fufu的)

# 解決方案
完成了分析,接下來就好處理了,只需要把快取區的東西清掉不要讓scanf傻傻的又去讀取就好啦!

相關程式碼段:while (getchar() != '\n');
這一句可以簡單地解決清楚快取區的功能
原理是每次都向快取區讀取資料,如果沒到尾就繼續讀取,直到把所有東西讀完,再跳出(注意while執行的是空語句)

到這裡,問題就都解決了 – 需求 OK,bug KO

# 完整程式碼

//以檢查輸入的是否一個整型為例(VS2019)
int n;
while (scanf_s("%d", &n) == 0)
{
	printf("輸入了非法字元,請重新輸入:"
); while (getchar() != '\n'); }

*注:這裡的getchar已經不用自己輸入了,原因和scanf的死迴圈一樣,緩衝區已經有東西了,getchar會直接讀取而不會讓我們輸入

執行結果:
在這裡插入圖片描述

可以看到問題已經完美解決了~


第3篇完成,打卡!!
冰凍三尺非一日之寒(寒冰小澈)