話不多說,碼來(最後再給大家分析原因)!
#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...