簡體   English   中英

使用std :: cin檢查有效的類型輸入(C ++)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM