入力が本当に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!
ステートメントを無限に出力するため、別の入力を求めるプロンプトは表示されません。入力を求めるプロンプトを表示し、正当かどうかを確認します...ダブルの場合は続行します...ダブルでない場合は、もう一度プロンプトを表示します。
何か案は?
これを試して:
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
}
}
これは基本的にエラー状態をクリアし、前の行に入力されたすべてのものを読み取って破棄します。
failbit
は、解析エラーが発生した場合に抽出演算子を使用した後に設定されます。確認できる簡単なテスト関数good
とfail
がいくつかあります。 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つの方法は、浮動小数点数が等しいかどうかを確認することです。
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;
}
}
私は使うだろう:
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";
}
#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;
}
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;
}
}