關於cin作為判斷條件所遇到的一些問題

2021-10-02 09:35:25 字數 1374 閱讀 5911

話不多說,碼來(最後再給大家分析原因)!

#includeusing namespace std;

int main() else

cout << "a:" << a << endl;

return 0;

}//如果我輸入5

true

rdstate()函式的返回值: 0

三個標記位返回的返回值: 000

goodbit標記位的返回值: 1

a:5//如果我輸入a 此時由於a是int型,但我們輸入了乙個char所以cin的輸入會失敗

false

rdstate()函式的返回值: 2

三個標記位返回的返回值: 100

goodbit標記位的返回值: 0

a:0

第二段**

#includeusing namespace std;

int main()

這一段**在執行的時候,如果最開始輸入乙個int資料,然後第二次輸入的時候輸入char資料,那麼程式的輸出和第一段**一致,但是如果我們第一次就輸入乙個字母,程式會把第一段**中false的結果連續輸出兩次,並不會讓我們輸入第二次,這是為什麼呢?

這是因為,當第一次我們輸入了乙個字母時,cin>>發現型別不匹配,會發生四種情況:

1.a的值保持不變

2.不匹配的輸入會被留在輸入佇列,也就是在緩衝區中不被讀取

3.cin物件中的乙個錯誤標記被設定為1,也就是上面提到的cin.fail()

4.對cin方法的呼叫將返回false(如果需要被轉換為bool型別)

所以這時需要將上面的注釋開啟,方法返回false意味著輸入出現了錯誤,非數字輸入設定錯誤標記意味著必須重置該標記,也就是cin.clear()方法的作用,程式才能繼續讀取輸入,但是這時候我們輸入的字母還在佇列中,這屬於無效輸入,所以需要使用cin.get()去吃掉緩衝區中的無效輸入,注意 cin.get()方法會讀取緩衝區中的任意乙個字元,包括空格和回車等

如果我們將上面的注釋開啟,那麼當我們第一次輸入字母時,程式會輸出第一段**提到的false的結果,然後cin.clear()重置錯誤標記符,然後cin.get()清空緩衝區中的第乙個字元,注意 是第乙個!!!!!然後我們就可以正常輸入第二個資料了。

我的方法是,通過乙個getline(cin,string)函式去清空緩衝區中的非法字元,關於如何清空緩衝區,我會繼續去研究一下並測試

通過查閱相關部落格並請教其他大神,最常用的是下面這種方式,這樣我們在緩衝區中輸入亂七八糟的字母都不會影響

int c;

while ((c = getchar()) != '\n' && c != eof);

精華 強推)

在cin後getline所遇到的問題

在c 中,使用cin讀取資料後,再使用getline讀字串,就會遇到buffer沒有清空的問題,具體如下 include include using namespace std void main for auto it text 輸入 3 abc ab 輸出 abc ab即本來還需要讀入3行字串,...

關於手機移植我所遇到的

之前剛來公司的時候,做了一款手機遊戲測試版,後來移植了三星,諾基亞,索愛這三個平台.今天想想有些移植遇到的一些問題忘的差不多了,想給自己做個備份,簡單的留下點記錄.以後也好翻閱翻閱.剛開始的時候是按wtk標準做的,如果一開始沒有針對哪個牌子的手機做遊戲,個人覺得還是按wtk標準來做先.為什麼呢,看了...

關於與條件判斷中的順序

原來還從來沒有注意到這個問題,關於條件與 的判斷先後問題,比如說 1 while stackhelp.isempty top stackhelp.peek 4 stackhelp.push top while top stackhelp.peek stackhelp.isempty stackhel...