我有一个string它可以是一个double,float或int。我想string通过进行函数调用将转换为数据类型。我目前正在使用诸如stof和等函数,stoi当输入不是a float或时会抛出异常int。还有另一种无需捕获异常即可转换字符串的方法吗?也许某些函数将a指针传递给floatas参数,然后仅返回a boolean,表示调用函数成功。我想避免try catch在我的任何代码中使用任何语句。
使用 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/
为了避免出现异常,请回到不存在异常的时间。这些功能是从C继承过来的,但是它们在今天仍然有用:strtod和strtol。(还有一个,strtof但是double会自动转换为浮动)。您可以通过查看解码是否到达字符串的末尾来检查错误,如零字符值所示。
char * pEnd = NULL;
double d = strtod(str.c_str(), &pEnd);
if (*pEnd) // error was detected
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3248 次 |
| 最近记录: |