web-dev-qa-db-ja.com

C ++でユーザー入力をdoubleとして検証するにはどうすればよいですか?

入力が本当にdoubleであるかどうかを確認するにはどうすればよいですか?

double x;

while (1) {
    cout << '>';
    if (cin >> x) {
        // valid number
        break;
    } else {
        // not a valid number
        cout << "Invalid Input! Please input a numerical value." << endl;
    }
}
//do other stuff...

上記のコードはInvalid Input!ステートメントを無限に出力するため、別の入力を求めるプロンプトは表示されません。入力を求めるプロンプトを表示し、正当かどうかを確認します...ダブルの場合は続行します...ダブルでない場合は、もう一度プロンプトを表示します。

何か案は?

18
Hristo

これを試して:

while (1) {
  if (cin >> x) {
      // valid number
      break;
  } else {
      // not a valid number
      cout << "Invalid Input! Please input a numerical value." << endl;
      cin.clear();
      while (cin.get() != '\n') ; // empty loop
  }
}

これは基本的にエラー状態をクリアし、前の行に入力されたすべてのものを読み取って破棄します。

14
casablanca

failbitは、解析エラーが発生した場合に抽出演算子を使用した後に設定されます。確認できる簡単なテスト関数goodfailがいくつかあります。 eofbitの処理が異なるため、これらは互いに正反対ですが、この例では問題になりません。

次に、再試行する前にfailbitをクリアする必要があります。

カサブランカが言うように、入力バッファに残っている非数値データも破棄する必要があります。

そう:

double x;

while (1) {
    cout << '>';
    cin >> x;
    if (cin.good())
        // valid number
        break;
    } else {
        // not a valid number
        cout << "Invalid Input! Please input a numerical value." << endl;
        cin.clear();
        cin.ignore(100000, '\n');
    }
}
//do other stuff...
1
Ben Voigt

1つの方法は、浮動小数点数が等しいかどうかを確認することです。

double x;

while (1) {
    cout << '>';
    cin >> x;
    if (x != int(x)) {
        // valid number
        break;
    } else {
        // not a valid number
        cout << "Invalid Input! Please input a numerical value." << endl;
    }
}
0
cpx

私は使うだろう:

double x;

while (!(std::cin >> x)) {
  std::cin.clear();
  std::cin.ignore(2147483647, '\n');
  std::cout << "Error.\n";
}

または

double x;

while ((std::cout << "> ") && !(std::cin >> x)) {
  std::cin.clear();
  std::cin.ignore(2147483647, '\n');
  std::cout << "Error.\n";
}
0
mmontoya
#include <iostream>
#include <string>

bool askForDouble(char const *question, double &ret)
{
        using namespace std;
        while(true)
        {
                cout << question << flush;
                cin >> ret;
                if(cin.good())
                {
                        return true;
                }
                if(cin.eof())
                {
                        return false;
                }
                // (cin.fail() || cin.bad()) is true here
                cin.clear();  // clear state flags
                string dummy;
                cin >> dummy; // discard a Word
        }
}

int main()
{
        double x;
        if(askForDouble("Give me a floating point number! ",x))
        {
                std::cout << "The double of it is: " << (x*2) << std::endl;
        } else
        {
                std::cerr << "END OF INPUT" << std::endl;
        }
        return 0;
}
0
Notinlist
bool is_double(double val)
{
bool answer;
double chk;
int double_equl = 0;     
double strdouble = 0.0;
strdouble = val;           
double_equl = (int)val;
chk = double_equl / strdouble;
if (chk == 1.00)
{
 answer = false; // val is integer
 return answer;
} else {
answer = true;  // val is double
return answer;
}
}
0
Snorri