2016-08-12 67 views
2

我試圖限制用戶只輸入'1'或'2'。輸入字符時出現無限循環

int ch; 

do 
{ 
    cout<<"Enter: \n"; 
    cin>>ch; 
    switch(ch) 
    { 
    case 1: 
     cout<<"1"; 
     break; 
    case 2: 
     cout<<"2"; 
     break; 
    default: 
     cout<<"Retry\n"; 
    } 
}while(ch != 1 && ch != 2); 

當我輸入任何數量大於1或2以外,程序運行通過詢問用戶重試細,但是當我輸入一個字符,程序進入到「重試」和「確認」的無限循環。

回答

3

這是因爲當你輸入一個非數字字符時,輸入操作符不能將其解析爲一個整數,而是將字符留在緩衝區中。所以下一次迭代循環會再次讀取完全相同的字符。一次又一次等。

克服這個問題,最簡單的方法是簡單地流問ignore該行的其餘部分:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input 

還有其他方面也一樣,在閱讀整個行到一個字符串,把那個字符串轉換爲輸入字符串流,然後讀取該流中的整數。雖然有更多的工作。這種方式確實意味着您不必檢查std::cin上的輸入失敗,但必須使用上述方法執行此操作。

你完整的代碼可能看起來像

int n; 
do 
{ 
    if (!std::cin >> n) 
    { 
     std::cout << "Only numbers accepted. Please try again.\n"; 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Skip bad input 
     std::cin.clear(); // Clear error flags 
    } 

    // switch ... 
} while (...);