C++ C++;如何检查输入浮点变量的有效输入

C++ C++;如何检查输入浮点变量的有效输入,c++,floating-point,C++,Floating Point,我正在写一个程序,它就像一个计算器;它根据用户输入的字符执行特定操作。程序的结构似乎工作正常,但我希望能够检查错误的输入。收到浮点变量后,是否有办法检查它是否不包含除数字和小数以外的任何字符?我尝试了isdigit,这是: if (!(cin >> x)) { cout << "You did not enter a correct number!" << endl; return; } if(!(cin>>x)){ 您是否可以测试流的状态

我正在写一个程序,它就像一个计算器;它根据用户输入的字符执行特定操作。程序的结构似乎工作正常,但我希望能够检查错误的输入。收到浮点变量后,是否有办法检查它是否不包含除数字和小数以外的任何字符?我尝试了
isdigit
,这是:

if (!(cin >> x)) {
    cout << "You did not enter a correct number!" << endl; 
    return;
}
if(!(cin>>x)){

您是否可以测试流的状态:

float x, y;
if (std::cin >> x >> y) {
    // input extraction succeeded
}
else {
    // input extraction failed
}

如果这对您不起作用,那么您需要发布不起作用的确切代码。

一种可能是将输入读取为字符串,然后使用boost-lexical\u-cast转换为浮点。lexical\u-cast仅在整个输入转换为目标时才认为转换成功,否则,它将抛出一个
错误的lexICALICASCAST/<代码> Ex> ./P> < P>检测错误字符串输入,在这里你期望一个数字,C++不自动知道你想要什么,所以一个解决方案是首先接受你的输入作为字符串,验证这些字符串,然后如果有效,然后使用ATOF()函数将字符串转换成浮点数字。

标准字符串类有一个名为FungFixSTyNoToFoF()的函数,帮助你告诉C++你认为哪些字符是有效的。如果函数发现一个字符不在列表中,它将返回坏字符的位置,否则返回字符串: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;
}
//add.cpp
#包括
#包括
#包含//用于atof()
使用名称空间std;
void Add()
{

cout另一个想法是根据正则表达式测试输入

-?[0-9]+([.][0-9]+)?
此方法还可以通过仅修改正则表达式来简化匹配机制,并且可以将多个正则表达式映射到不同类型的输入,例如,一个整数可以表示为

-?[0-9]+
但是,请记住,这只测试输入是否为有效格式,之后仍然需要进行数字转换(我更喜欢boost::lexical_cast)


(您也可以尝试使用)

可能的重复检查到重复的链接,也许它可以帮助您提供一个对您不起作用的输入的小样本,以及您希望它做什么?@Jack:我看不出它是重复的。另一个问题是告诉字符串是否转换为有效的浮点数,这是关于读取输入。有很大的区别,因为
cin>>x>>y;
不会产生字符串。事实上,我会读取字符串,然后检查,然后将其转换为浮点数,如果它是正确的。谢谢Shawn!这个解决方案非常适合我。我只是将其作为函数编码,现在可以使用它来获取所有操作函数的输入。非常感谢谢谢你的帮助,我将来可能会有更多的问题,这个网站将是一个很大的帮助!干杯。
-?[0-9]+