c ++,如何验证数据输入是否为正确的数据类型

时间:2012-10-04 07:02:22

标签: c++ cin

  

可能重复:
  how do I validate user input as a double in C++?

我是C ++的新手,我有一个功能,我希望用户输入double值。我如何确保输入的值是正确的数据类型?另外,如何处理错误?目前这就是我的全部:

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

我使用`try {} catch(){},但我不认为这是解决此问题的正确方法。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:18)

如果ostream& operator>>(ostream& , T&)未能提取格式化数据(例如整数,双精度,浮点数等),stream.fail()将为真,因此!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');

您的循环将永远不会结束,因为输入未从标准输入中清除。

另见:

答案 1 :(得分:3)

您需要使用std::getlinestd::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;
    }
}

答案 2 :(得分:0)

此示例是自解释的,但是使用此方法,您无法区分intdouble数据类型。

int main()
{
  double number = 0;

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