c ++ atof。如何检查输入错误?

时间:2016-11-28 13:54:30

标签: c++ string double atof

所以我使用atof将我的字符串转换为double。但是我需要知道输入是否错误(如y564等)。我怎么检查呢?我需要正确的号码才能进一步采取行动。

double x = atof(s.c_str());

5 个答案:

答案 0 :(得分:5)

您可能想要使用std::stod

[live]

bool parse_double(std::string in, double& res) {
    try {
        size_t read= 0;
        res = std::stod(in, &read);
        if (in.size() != read)
            return false;
    } catch (std::invalid_argument) {
        return false;
    }    
    return true;
}

int main()
{
    double d;
    bool b = parse_double("123z", d);
    if (b)
      std::cout << d;
    else
      std::cout << "Wrong input";
}

[编辑]

您可能会找到here

  

返回值

     

对应成功的str内容的double值。如果转换后的值超出返回类型的范围,则返回值未定义。 如果无法执行转换,则返回0.0

因此无法确定输入是否错误或包含0

答案 1 :(得分:1)

使用std::stod。它会抛出无效输入的异常。或者,如果您坚持使用C解决方案,请使用strtod;它为您提供了有关结果的更多信息。

答案 2 :(得分:1)

atof(http://en.cppreference.com/w/cpp/string/byte/atof)的定义:

  

返回值

     

对应成功的str内容的double值。如果转换后的值超出返回类型的范围,则返回值未定义。如果无法执行转换,则返回0.0。

如果您使用现代c ++并且现在必须返回,请更好地使用std::strtodhttp://en.cppreference.com/w/cpp/string/byte/strtof):

double strtod( const char* str, char** str_end );

并定义其返回值:

  

返回值

     

与成功时str的内容对应的浮点值。如果转换后的值超出相应返回类型的范围,则会发生范围错误,并返回HUGE_VAL,HUGE_VALF或HUGE_VALL。如果不能执行转换,则返回0并将* str_end设置为str。

答案 3 :(得分:0)

拯救的正则表达式(即libpcre):

import oracle.jdbc.pool.OracleDataSource;
import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

PoolDataSource poolDataSource = PoolDataSourceFactory.getPoolDataSource();
poolDataSource.setConnectionFactoryClassName(OracleDataSource.class.getName());
poolDataSource.setURL("jdbc:oracle:thin:@localhost:1521:XE");
poolDataSource.setUser("SYSTEM");
poolDataSource.setPassword("****");

有关安装/编译的详细信息,请参阅// checked_atof.cpp #include <iostream> #include <cstdlib> #include <pcrecpp.h> const char FP_RE[] = "^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?"; using namespace std; int main() { std:string s; double number; pcrecpp::RE fpre(FP_RE); cout << "Enter a floating point number: " << endl; cin >> s; if (!fpre.FullMatch(s)) { cout << "Sorry, not a valid floating point number!" << endl; } else { number = atof(s.c_str()); cout << "Ok, result: " << number << endl; } return 0; } 文档 - 以下内容可能适用于您的系统:

libpcre

g++ checked_atof.cpp $(pkg-config --cflags libpcrecpp) $(pkg-config --libs libpcrecpp) -o checked_atof

答案 4 :(得分:-1)

您只需检查字符串中的每个字符是否为'。'或std::isdigit(int ch)之前将其传递给atof(并且'。'必须是唯一的)

更简洁的解决方案是使用正则表达式(如^[0-9]+(\.[0-9]+)?$)对您的字符串应该适用于通用浮点值。