2013-03-03 66 views
0

我想知道是否有任何停止字母輸入一個整數。這裏是我在我的int main中使用的代碼。你可以停止輸入一個整數的字母嗎?

do 
{ 
    cout << "Player 1 please enter the value of the row you would like to take "; 
    cin >> row; 
}while (row != 0 && row != 1 && row != 2 && row != 3); 

這個代碼的問題是,如果用戶輸入一個字母,它會創建一個永無止境的循環。任何幫助將非常感激。

+0

這個作業是否有像「只使用我們已經學過的標準C++東西」的約束?如果這是更「真實的」,那麼有很多選擇,這取決於操作系統和許可問題。 – hyde 2013-03-03 11:27:23

回答

4

標準庫不提供任何可以過濾通過標準輸入輸入的字符的內容。我相信你可以使用像curses這樣的庫來做到這一點。

但是你可以做的是檢查輸入是否成功。 operator>>int將流的狀態設置爲failbit,如果它不能爲一個整數(例如,當它遇到'a'或類似的東西,你可以用提取運營商在布爾上下文中,這樣的事情:

cout << "Player 1 please enter the value of the row you would like to take "; 

while (!(cin >> row) || (row < 0 || row > 3)) { 

    cout << "Invalid input, try again!\n"; 
    // clear the error flags and discard the contents, 
    // so we can try again 
    cin.clear(); 
    cin.ignore(std:numeric_limits<std::streamsize>::max(), '\n'); 
} 

請注意,如果您例如1abc輸入,讀取將succesfuly閱讀1和流中離開abc,這可能不是一個期望的行爲。如果你希望把它看成一個錯誤,你可以說

if ((cin >> std::ws).peek() != EOF) { /* there's more input waiting */ } 

並採取相應的行動,或者只有在您有價值時,無條件地忽略流中的所有內容。

1

一次只獲取一個字符,並且只將數字字符添加到字符串中。使用

cin.get(); 

在循環中。

+0

這有問題,默認輸入是基於行的。這意味着,即使輸入第一個字符用戶,getchar也不會返回,直到用戶輸入整行並按回車。 – hyde 2013-03-03 11:14:20

+0

如果你甚至不想看到這個角色,那麼你就必須用Windows來降低你可以使用的CWnd :: OnKeyDown – QuentinUK 2013-03-03 11:19:07

相關問題