将字符串转换为整数,双精度,浮点数,而不必捕获异常

And*_*v93 4 c++ exception

我有一个string它可以是一个doublefloatint。我想string通过进行函数调用将转换为数据类型。我目前正在使用诸如stof和等函数,stoi当输入不是a float或时会抛出异常int。还有另一种无需捕获异常即可转换字符串的方法吗?也许某些函数将a指针传递给floatas参数,然后仅返回a boolean,表示调用函数成功。我想避免try catch在我的任何代码中使用任何语句。

pze*_*zed 6

使用 astd::stringstream并捕获 的结果operator>>()

例如:

#include <string>
#include <iostream>
#include <sstream>

int main(int, char*[])
{
    std::stringstream sstr1("12345");
    std::stringstream sstr2("foo");

    int i1(0);
    int i2(0);

    //C++98
    bool success1 = sstr1 >> i1;
    //C++11 (previous is forbidden in c++11)
    success1 = sstr1.good();

    //C++98
    bool success2 = sstr2 >> i2;
    //C++11 (previous is forbidden in c++11)
    success2 = sstr2.good();

    std::cout << "i1=" << i1 << " success=" << success1 << std::endl;
    std::cout << "i2=" << i2 << " success=" << success2 << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

印刷:

i1=12345 success=1
i2=0 success=0
Run Code Online (Sandbox Code Playgroud)

请注意,这基本上就是boost::lexical_cast这样做的,除了在失败时boost::lexical_cast抛出boost::bad_lexical_cast异常而不是使用返回码。

请参阅:http : //www.boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast.html

对于 std::stringstream::good,请参见:http ://www.cplusplus.com/reference/ios/ios/good/


Mar*_*som 5

为了避免出现异常,请回到不存在异常的时间。这些功能是从C继承过来的,但是它们在今天仍然有用:strtodstrtol。(还有一个,strtof但是double会自动转换为浮动)。您可以通过查看解码是否到达字符串的末尾来检查错误,如零字符值所示。

char * pEnd = NULL;
double d = strtod(str.c_str(), &pEnd);
if (*pEnd) // error was detected
Run Code Online (Sandbox Code Playgroud)