C++は初めてですが、ユーザーにdouble
値を入力させたい関数があります。値の入力が正しいデータ型であることを保証するにはどうすればよいですか?また、エラーはどのように処理されますか?現時点ではこれだけです。
if(cin >> radius){}else{}
私は `try {} catch(){}を使用していますが、それがこの問題の正しい解決策になるとは思いません。任意の助けいただければ幸いです。
ostream& operator>>(ostream& , T&)
がフォーマットされたデータ(integer、double、float、...など)の抽出に失敗した場合、stream.fail()
はtrueになるため、_!stream
_もtrueと評価されます。
だからあなたは使うことができます
_cin >> radius;
if(!cin){
cout << "Bad value!";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin >> radius;
}
_
または単に
_while(!(cin >> radius)){
cout << "Bad value!";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
_
_operator>>
_は誤った形式であるため、ストリームからデータを抽出しないため、行の残りの部分をignore
にすることが重要です。だからあなたが削除した場合
_cin.ignore(numeric_limits<streamsize>::max(), '\n');
_
入力は標準入力からクリアされないため、ループが終了することはありません。
以下も参照してください。
std::basic_istream::ignore
_ (_cin.ignore
_)std::basic_istream::fail
_ (cin.fail()
)std::numeric_limits
_ (無視される文字の最大数に使用され、_<limits>
_で定義されます)。std::getline
およびstd::string
を使用して、行全体を読み取る必要があります。これは、行全体が正しいデータ型であることを完全に検証する方法です。
std::string line;
while(std::getline(std::cin, line))
{
std::stringstream ss(line);
if ((ss >> radius) && ss.eof())
{
// Okay break out of loop
break;
}
else
{
// Error!
std::cout << "Invalid input" << std::endl;
}
}
この例は自明ですが、このアプローチではint
とdouble
のデータ型を区別できません。
int main()
{
double number = 0;
if (!(std::cin >> number))
{
std::cout << "That's not a number; ";
}
else
{
std::cout << "That's a number; ";
}
}