13

重複の可能性:
C++ でユーザー入力を double として検証するにはどうすればよいですか?

私は C++ が初めてで、ユーザーにdouble値を入力してもらいたい関数があります。値の入力が正しいデータ型であることを保証するにはどうすればよいですか? また、エラーはどのように処理されますか? 現時点では、これが私が持っているすべてです:

if(cin >> radius){}else{}

「try{}catch(){} を使用していますが、それがこの問題の適切な解決策になるとは思いません。どんな助けでも大歓迎です。

4

3 に答える 3

22

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');

入力が標準入力からクリアされないため、ループが終了することはありません。

参照:

于 2012-10-04T07:20:34.213 に答える
3

とを使用して行全体を読み取る必要があり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;
    }
}
于 2012-10-04T07:33:21.987 に答える
1

この例は自明ですが、このアプローチではintdoubleデータ型を区別できません。

int main()
{
  double number = 0;

  if (!(std::cin >> number))
  {
    std::cout << "That's not a number; ";
  }
  else
  {
    std::cout << "That's  a number; ";
  }
}   
于 2012-10-04T07:35:14.610 に答える