我有一个string
,可以是double
,float
或int
。我想通过进行函数调用将string
转换为数据类型。我目前正在使用stof
和stoi
等函数,当输入不是float
或int
时会抛出异常。还有另一种方法来转换字符串而不必捕获异常吗?也许某些函数将指针传递给float
作为参数,并返回一个boolean
,表示调用函数的成功。我想避免在我的任何代码中使用任何try
catch
语句。
答案 0 :(得分:5)
为避免异常,请返回不存在异常的时间。这些函数是从C继承的,但它们今天仍然有用:strtod
和strtol
。 (还有一个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