目前有两种 string 转 整形的方式
std::atoi(const char*);
std::stoi(const std::string);
atoi() 是c语言风格,而stoi()是c++11标准库中新增的函数
两者的区别在
- atoi()的参数是 const char* , 所以我们必须将字符串的类型从string转换为const char类型才能够转换为int。string转const char 我们可以使用c_str();
- stoi()的参数是const string,不需要转化为 const char*;
- stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!
- atoi()不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界;
- 如果输入字符串不是一个有效的数字字符串(例如字符串中含有字母),
stoi()
会抛出一个invalid_argument
异常,会使程序崩溃。 - atoi()如果遇到无效的输入,会返回0,而不提供任何错误检查或处理机制。
stoi()
是C++11标准库中新增的函数,提供了更多的功能和安全性,因为它支持更多的错误检查和处理机制,并且可以处理带符号的整数字符串。atoi
是C语言中的函数,不提供任何错误检查或处理机制,且只能处理不带符号的整数字符串。
相对来看 stoi() 相较于 atoi() 更适合我们使用,但是它也存在遇到非数字字符会抛出异常的问题。如果我们面临的使用场景是 字符串中带有非数字字符,则需要我们对字符串进行拆分、删减后才能够使用stoi() 。
int StringToInt(const std::string& str)
{
int ret;
std::istringstream is(src);
is >> ret;
return ret;
}
StringToInt函数能够避免因为字符串中带有非数字字符而抛出错误,但是有使用场景限制。
- 字符串开头不能为非数字字符
- 如果类似 “13a13” 这种数字字符与非数字字符交替的情况,则只会对非数字字符前的数字字符进行转换