0

言語: C++ (IDE: Visual Studios) ユーザーが整数以外を入力したときに do while ループが true を返すようにするにはどうすればよいですか? これを行う方法について少し迷っています。

#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 || );
4

2 に答える 2

5

istream最後の読み取りが成功したかどうかを示す変換をbool定義します。これを使用して、解析がdouble成功したかどうかをテストできます。

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

ストリームが失敗した状態にあり、読み取りを再試行する場合 (たとえば、ユーザーに新しい値を求めるプロンプトを表示する場合)、clear()メンバー関数を使用して状態を通常に戻すことができます。

cin.clear();

ただし、これは入力バッファをクリアしないため、同じデータを再度読み取ることになります。次の改行文字まで入力バッファをクリアできます。

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

または、代わりに行ごとに読み取り、 a を使用しstringstreamて個々の値を読み取ることができます。

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

これには、ユーザー入力を強制的に行ベースにするという利点があります。デフォルトではトークンベースです。

于 2013-05-08T01:34:20.360 に答える
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);

これにより、double に変換されないものはすべてキャッチされ、money の値が -1 になります。それ以外の場合は、プログラムを続行します。

于 2013-05-13T06:24:29.233 に答える