可能重复:
如何在 C++ 中将用户输入验证为双精度?
我是 C++ 新手,我有一个函数,我希望用户在其中输入一个double
值。我将如何确保输入的值是正确的数据类型?另外,如何处理错误?目前,这就是我所拥有的:
if(cin >> radius){}else{}
我使用 `try{}catch(){},但我认为这不是解决此问题的正确方法。任何帮助,将不胜感激。
可能重复:
如何在 C++ 中将用户输入验证为双精度?
我是 C++ 新手,我有一个函数,我希望用户在其中输入一个double
值。我将如何确保输入的值是正确的数据类型?另外,如何处理错误?目前,这就是我所拥有的:
if(cin >> radius){}else{}
我使用 `try{}catch(){},但我认为这不是解决此问题的正确方法。任何帮助,将不胜感激。
如果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');
你的循环永远不会结束,因为输入没有从标准输入中清除。
也可以看看:
std::basic_istream::ignore
( cin.ignore
)std::basic_istream::fail
( cin.fail()
)std::numeric_limits
(用于忽略字符的最大数量,定义在 中<limits>
)。您需要使用std::getline
and阅读整行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; ";
}
}