2013-05-08 31 views
0

語言:C++(IDE:Visual Studios) 如何在while循環返回true時輸入除整數以外的任何內容?我在如何做到這一點上有點失落。如果字符或字符串返回false,但如果輸入無法轉換爲整數,則返回true。 C++ Do while循環

#include <iostream>//pre processor directive 
#include <string> 
#include <iomanip> 
using namespace std;//standard library 

int main() 

double money=0; 

do{ 
    cout << ("please enter your taxable income:\n") << fixed << setprecision(2) << endl; 

    cin >> (money); 

}while(money < 0 ||); 
+2

''#include //預處理器指令' - '<3'。 – 2013-05-08 01:31:11

+0

我有更多的代碼,但這是我需要答案的代碼的唯一部分。 – JORDANO 2013-05-08 01:31:30

+1

提示:'std :: istream'提供了一個'operator bool()',它可以將其轉換爲布爾值。 – chris 2013-05-08 01:32:53

回答

0

最後我只是在做一個try/catch語句,基本上涉及到了我加入一個新的變量的組合,這是字符串「STR」:

double money = 0; //initialized 
    string str= ""; //initialized 

    do{ 

     cout << "Please input an integer value" << endl; 
     cin >> (str); 

     try{ 
      money = stod(str); //string to double 
     }catch(...){ //inside the parenthesis, the "..." means to catch all exceptions. 
      money = -1;  
      cin.clear(); 
     } 

    }while(money < 0); 

這將捕獲任何不轉換增加一倍,使金錢的價值等於-1。否則,它將繼續執行該程序。

5

istream定義conversion to bool這表明最後的讀取是否成功。您可以使用它來測試是否解析double成功:

if (cin >> money) { 
    // success 
} else { 
    // failure 
} 

如果流處於故障狀態,要重讀 - 例如,提示輸入新的用戶價值,那麼你可以使用clear()成員函數的狀態恢復到正常:

cin.clear(); 

但是,這不會清除輸入緩衝區,所以你最終會再次讀取相同的數據。您可以清除輸入緩衝區,直到下一個換行符:

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

或者您也可以通過線,而不是閱讀,並使用stringstream讀取單個值:

string line; 
getline(cin, line); 
istringstream stream(line); 
if (stream >> money) { 
    // success 
} else { 
    // failure 
} 

這具有迫使用戶的優勢輸入是基於行的 - 默認情況下它是基於標記的。

+2

如果轉換失敗,您還需要在重試之前清除輸入緩衝區(除了流狀態之外),否則將陷入無限循環。 – 2013-05-08 01:37:15

+0

@MatteoItalia:謝謝,我應該在前面提過。更新。 – 2013-05-08 04:05:09

相關問題