[英]Checking for valid type input using std::cin (C++)
我正在為C ++類開發游戲“ Hex”,但在理解如何確保cin讀取正確類型方面遇到困難。 我已經進行了一些研究,並且很接近,但這是我的問題:
int i, j;
while(true){
cin >> i;
if(cin.fail() ){ //if type wasn't right
cin.clear(); //clear stream
cin.ignore(); //ignore left over data
cout << "First value is invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
cin >> j;
if(cin.fail() ){ //if type wasn't right
cin.clear(); //clear stream
cin.ignore(); //ignore left over data
cout << "Second value is invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
if(i < 0 or i >= size or j < 0 or j >= size){
//prompt that input is wrong
cout << "Invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
那里有break語句,它確實可以了。 我的問題是這樣的運行:
Player 1's turn
Enter the row and column coordinate with only a space inbetween
a b
First value is invalid input! Valid coordinates are in range 0 to 10
First value is invalid input! Valid coordinates are in range 0 to 10
u 8
First value is invalid input! Valid coordinates are in range 0 to 10
8 u
當兩個值都不相同時,它不會檢測到第二個值是不正確的,並且當只有第二個值不正確時,它不會將其檢測為錯誤。 我看過http://www.cplusplus.com/reference/iostream/cin/?kw=cin ,它甚至沒有有關故障,清除和忽略功能的文檔,所以我不太了解他們。 提前致謝!
u 8
First value is invalid input! Valid coordinates are in range 0 to 10
8 u
如cin >> i;
由於u
失敗,循環被重復,但是cin.ignore();
僅消耗cin
流中的第一個字符(空格cin.ignore();
。 隨着循環再次開始, cin >> i;
使用流中剩余的內容(在本例中為8
。 這意味着在錯誤消息后, First value is invalid input! Valid coordinates are in range 0 to 10
First value is invalid input! Valid coordinates are in range 0 to 10
,程序實際上正在等待cin >> j;
。 輸入8 u
,它將首先讀取8
並將其值分配給j,這意味着沒有故障。 循環結束,並且u
留在流中。
要解決此問題,請更改cin.ignore();
通過cin.ignore(numeric_limits<streamsize>::max(), '\\n');
。 除了忽略下一個字符(在此示例中為空格)之外,它還將忽略行的其余部分,從而有效地重置cin
流。 您需要包括<limits>
標頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.