C ++如何检查有效输入的输入float变量

时间:2010-11-24 20:37:07

标签: c++ floating-point

我正在编写一个充当计算器的程序;基于用户输入的字符,它执行特定操作。该程序的结构似乎工作正常,但我希望能够检查错误的输入。收到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;
}

4 个答案:

答案 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/

进行试用