我正在编写一个充当计算器的程序;基于用户输入的字符,它执行特定操作。该程序的结构似乎工作正常,但我希望能够检查错误的输入。收到float变量后,有没有办法检查它是否包含除数字和小数以外的任何字符?我试过了isdigit
,而且这个:
if (!(cin >> x)) {
cout << "You did not enter a correct number!" << endl;
return;
}
但似乎没有任何效果。
以下是我正在使用的一个简单操作函数的示例:
void Add(){
float x = 0, y = 0, z = 0;
cout << "Please enter two numbers you wish "
<< "to add separated by a white space:" << endl;
cin >> x >> y;
z = x+y;
cout << x << " + " << y << " = " << z << "." << endl;
return;
}
答案 0 :(得分:2)
您测试流的状态:
float x, y;
if (std::cin >> x >> y) {
// input extraction succeeded
}
else {
// input extraction failed
}
如果这不适合你,那么你需要发布不起作用的确切代码。
答案 1 :(得分:1)
要检测错误的字符串输入,你预期一个数字,C ++不会自动知道你想要什么,所以一个解决方案是首先接受你的输入作为字符串,验证这些字符串,然后如果有效,只有将字符串转换为使用atof()函数浮点数。
标准字符串类有一个名为find_first_not_of()的函数,可以帮助您告诉C ++您认为哪些字符有效。如果函数找到不在列表中的字符,它将返回错误字符的位置,否则返回string :: npos。
// add.cpp
#include <iostream>
#include <string>
#include <cstdlib> // for atof()
using namespace std;
void Add()
{
cout << "Please enter two numbers you wish "
<< "to add, separated by a white space:"
<< endl;
string num1, num2;
cin >> num1;
if( num1.find_first_not_of("1234567890.-") != string::npos )
{
cout << "invalid number: " << num1 << endl;
return;
}
cin >> num2;
if( num2.find_first_not_of("1234567890.-") != string::npos )
{
cout << "invalid number: " << num2 << endl;
return;
}
float x = 0, y = 0, z = 0;
x = atof( num1.c_str() );
y = atof( num2.c_str() );
z = x+y;
cout << x << " + " << y << " = " << z << "." << endl;
}
int main(void)
{
Add();
return 0;
}
答案 2 :(得分:0)
一种可能性是将输入作为字符串读取,然后使用boost lexical_cast转换为浮点。如果整个输入转换为目标,则lexical_cast仅认为转换成功 - 否则,它将抛出bad_lexical_cast
异常。
答案 3 :(得分:-1)
另一个想法是针对正则表达式测试输入。浮点数的示例正则表达式可以是
-?[0-9]+([.][0-9]+)?
此方法还可以通过仅修改正则表达式来更轻松地优化匹配机制,并且可以针对不同类型的输入映射多个正则表达式,例如,整数可以表示为
-?[0-9]+
等等。但请记住,这仅测试输入是否为有效格式,之后仍然需要进行数值转换(我更喜欢boost :: lexical_cast)。
(您也可以使用http://gskinner.com/RegExr/)
进行试用