2013-02-16 46 views
2

該程序在指定範圍內打印指定數量的數字。但是,當我輸入一個字符時,它會無限循環地循環執行,例如:如果我在「輸入最大數字」cin中輸入一個字符,它只是無休止地掃描「輸入最大數字」,它只是跳過在CIN和循環的COUT(同樣適用於其他2 DO-田地。任何人都知道爲什麼嗎?不停地循環cout,忽略cin

#include <iostream> 
#include <cmath> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

int roll(int mini, int maxi) 
{ 
     int v = maxi - mini; 
     int x = mini + (rand() % (v+1)); 
     return x; 

} 
void caller() 
{ 
    int a; 
    int b; 
    int c; 

    do { 
    cout << "Enter minimum number" << endl; 
    cin.clear(); 
    cin >> a; 
    } while (cin.fail()); 

    do { 
    cout << "Enter maximum number" << endl; 
    cin.clear(); 
    cin >> b; 
    } while (cin.fail() || a > b); 

    do { 
    cout << "How many rolls?" << endl; 
    cin.clear(); 
    cin >> c; 
    } while (cin.fail()); 

    for (int i = 0; i < c; i++) 
    cout << roll(a, b) << endl; 
} 

int main() 
{ 
    srand (time(NULL)); 
    caller(); 
    return 0; 
} 
+0

你從來沒有真正提取過的字符。它只是在下次嘗試閱讀時坐在那裏。 – chris 2013-02-16 07:21:16

+0

我還是個初學者,你的意思是什麼?我該如何解決這個問題? – Foxic 2013-02-16 07:23:31

+1

既然您沒有真正讀過它,它仍然在流中,所以下次嘗試讀取任何內容時,它將首先讀取,這會再次導致問題。使用'ignore'或其他東西來放棄不可讀的(至少對於'int')字符。 – chris 2013-02-16 07:28:59

回答

2

我不喜歡使用istream::fail()進行閉環控制。對於類似的問題,請參見Why is iostream::eof inside a loop condition considered wrong?

相反,我依靠istream::operator >>的返回值。

我還使用以下函數重置標誌S和清除輸入流的輸入:

void flush_stream(std::istream& stream) 
{ 
    stream.clear(); 
    stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

更多關於此見How do I flush the cin buffer?

所以我想這樣編寫你的輸入檢查:

int get_valid_number(const std::string& prompt) 
{ 
    int number = 0; 

    bool valid = false; 
    while (!valid) 
    { 
     std::cout << prompt << std::endl; 
     if (std::cin >> number) 
     { 
      valid = true; 
     } 
     flush_stream(std::cin); 
    } 

    return number; 
} 

希望提取到一個函數這個好處是顯而易見的。 See it run

+0

雖然我更喜歡這種方式,但運算符bool()和operator void *()使用fail()來確定返回值。 – chris 2013-02-16 16:41:09

2

你可以嘗試做這樣

int a; 
string trash; 

do { 
    cout << "Enter minimum number" << endl; 
    cin >> a; 

    if(cin.fail()){ 
    cin.clear(); 
    cin >> trash; 
    } 

} while (cin.fail()); 

這東西會被扔進trash字符串中刪除從CIN流的任何錯誤的輸入。

此鏈接可能會幫助您更好地瞭解這些cin功能。

http://web.eecs.utk.edu/~cs102/lectures/cinLecture.html