2016-11-23 198 views
1

我現在有這個功能:While循環跳過排隊

double GrabNumber() { 
    double x; 
    cin >> x; 
    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

其目的是檢查是否x是一個有效的數字,它返回它是否有效或重複cin >> x如果事實並非如此。

它的這種功能中調用:

void addition() { 
    cout << "\nEnter the first number: "; 
    double a = GrabNumber(); 
    cout << "Enter the second number: "; 
    double b = GrabNumber(); 
// rest of code 

當我鍵入如「6+」時,它告訴我,進入第一個數字,它接受它,但立即轉到第二線並調用它的錯誤,甚至沒有輸入我的輸入。

我認爲這是因爲第一個輸入只接受「6」,而「+」進入第二個輸入返回一個錯誤。因此,參數while必須存在問題。

+1

我想你將不得不使用['getline'](http:// www .cplusplus.com/reference/string/string/getline /)並解析完整的行,而不是像那樣使用'cin' – Garf365

+0

但Getline作爲字符串讀取 –

回答

4

如果您的輸入立即成功,您不會忽略該行的其餘部分,最後輸入下一個輸入。這可以通過簡單地複製cin.ignore呼叫來解決。

double GrabNumber() { 
    double x; 
    cin >> x; 

    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- 

    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

我會離開乾燥此代碼作爲練習;)

2

爲了避免這種問題,更喜歡使用getlinestod

double GrabNumber() { 
    double x; 
    bool ok = false; 
    do 
    { 
     std::string raw; 
     std::getline (std::cin, raw); 
     try 
     { 
      x = stod(raw); 
      ok = true; 
     } 
     catch(...) 
     {} 
    } while(!ok); 
    return x; 
} 

在一般的情況下,它更容易獲取原始字符串getline,並在之後進行解析。這樣,你可以檢查你想要的一切:字符數,符號位置,如果只有數字字符,