私は C++ が初めてで、ユーザーにdouble
値を入力してもらいたい関数があります。値の入力が正しいデータ型であることを保証するにはどうすればよいですか? また、エラーはどのように処理されますか? 現時点では、これが私が持っているすべてです:
if(cin >> radius){}else{}
「try{}catch(){} を使用していますが、それがこの問題の適切な解決策になるとは思いません。どんな助けでも大歓迎です。
私は C++ が初めてで、ユーザーにdouble
値を入力してもらいたい関数があります。値の入力が正しいデータ型であることを保証するにはどうすればよいですか? また、エラーはどのように処理されますか? 現時点では、これが私が持っているすべてです:
if(cin >> radius){}else{}
「try{}catch(){} を使用していますが、それがこの問題の適切な解決策になるとは思いません。どんな助けでも大歓迎です。
ostream& operator>>(ostream& , T&)
フォーマットされたデータ(integer、double、floatなど)の抽出に失敗した場合、 stream.fail()
trueになるため、true!stream
と評価されます。
だからあなたは使うことができます
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');
}
間違った形式であるため、ストリームからデータを抽出しなくなるignore
ため、残りの行にとって重要です。operator>>
だからあなたが削除した場合
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; ";
}
}