将字符串转换为integer,double,float而不必捕获异常

时间:2014-07-16 15:56:51

标签: c++ exception

我有一个string,可以是doublefloatint。我想通过进行函数调用将string转换为数据类型。我目前正在使用stofstoi等函数,当输入不是floatint时会抛出异常。还有另一种方法来转换字符串而不必捕获异常吗?也许某些函数将指针传递给float作为参数,并返回一个boolean,表示调用函数的成功。我想避免在我的任何代码中使用任何try catch语句。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

使用std::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;
}

打印:

i1=12345 success=1
i2=0 success=0

注意,这基本上是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/

答案 2 :(得分:1)

Mark Ransom,你一针见血。我理解 RagHaven,因为在某些情况下异常是令人讨厌的,将字母数字链转换为双精度应该是轻而快的,不受异常处理机制的影响。我发现一个由五个字母组成的字符串排序算法需要 3 秒以上的时间,因为过程中抛出了异常,并且软件中的某个地方出现了一些问题。

在不启动异常的情况下搜索转换函数时,我发现了这一点(我使用 C++ Builder):

#:kivy 2.0.0 

<GeneratorScreen>:
    
    FloatLayout:
        pos:0,0
        size: root.width, root.height
        
        Label:
            id: text_editor_output
            background_color: (140, 146, 156, 1)
            text: "placeholder"
            size_hint:(.8, .8)
            pos_hint: {'x': .04, 'y': .04}
            pos_hint: {'bottom':1.0}

        TextInput:
            id: text_editor_input
            markup: True
            color: (255, 255, 255, 1)
            text: 'type here'
            size_hint:(.8, .8)
            pos_hint: {'x': .04, 'y': .04}
            pos_hint: {'bottom':1.0}
    

    AnchorLayout:
        anchor_x: "right"
        anchor_y: "top"
        size: root.width, root.height

        GridLayout:
            size_hint: None, None
            pos_hint: {'x': .9, 'y': 1}
            size:200, 200
            cols: 3
            pos_hint: {'right':1.0}

            Button:
                id: settlement_button
                text: 'Settlement'
                font_size: 10
                size_hint: None, None
                size: 67, 20
                on_press: root.settlement()

            Button:
                id: npc_button
                text: 'Npc'
                font_size: 10
                size_hint: None, None
                size: 67, 20 
                on_press: root.npc()

            Button:
                id: store_button
                text: 'Store'
                font_size: 10
                size_hint: None, None
                size: 67, 20 

            Button:
                id: other_button
                text: 'other'
                font_size: 10
                size_hint: None, None
                size: 67, 20 

    AnchorLayout:
        anchor_x: "right"
        anchor_y: "bottom"
        size: root.width, root.height

        TextInput:
            id: gen_output
            pos_hint: {'bottom': 1.0}
            pos_hint: {'right':1.0}
            size_hint: None, None
            size: 200, 200
            text: ''
            font_size: 15
            
                        
    AnchorLayout:
        anchor_x: "left"
        anchor_y: "top"
        size: root.width, root.height

        Button:
            size_hint: None, None
            size: 30,30
            text:"save"
            on_press: root.save()


该函数尝试返回一个浮点数,如果它不成功,它不会启动异常,而是返回在第二个参数中传递的值(例如可以放入 double StrToFloatDef(string, double def); 。检查如果返回值与“def”匹配,则您可以无异常地控制结果。

Mark 的提议,std::numeric_limits<double>::max()),同样出色,但速度更快、标准且安全。 RagHaven 要求的函数可能如下所示:

std::strtod