13

可能重复:
如何在 C++ 中将用户输入验证为双精度?

我是 C++ 新手,我有一个函数,我希望用户在其中输入一个double值。我将如何确保输入的值是正确的数据类型?另外,如何处理错误?目前,这就是我所拥有的:

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

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

4

3 回答 3

22

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

你的循环永远不会结束,因为输入没有从标准输入中清除。

也可以看看:

于 2012-10-04T07:20:34.213 回答
3

您需要使用std::getlineand阅读整行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

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; ";
  }
}   
于 2012-10-04T07:35:14.610 回答