web-dev-qa-db-ja.com

c ++、データ入力が正しいデータ型であることを確認する方法

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

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

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

私は `try {} catch(){}を使用していますが、それがこの問題の正しい解決策になるとは思いません。任意の助けいただければ幸いです。

12
Brook Julias

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

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

以下も参照してください。

19
Zeta

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;
    }
}
3
Jesse Good

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

int main()
{
  double number = 0;

  if (!(std::cin >> number))
  {
    std::cout << "That's not a number; ";
  }
  else
  {
    std::cout << "That's  a number; ";
  }
}   
1
Vikas