在使用std::stoi
进行字符串到整数的转换时,确实存在一个问题,即如果字符串包含非数字字符,std::stoi
会停止解析并返回解析到的整数部分,这可能导致未被注意到的错误。为了避免这种情况,可以采取以下措施:
-
使用异常处理:使用
try-catch
块来捕获std::stoi
可能抛出的std::invalid_argument
和std::out_of_range
异常。这可以帮助你识别和处理无法转换为整数的字符串 。 -
检查解析长度:
std::stoi
函数的第二个参数可以用来检查解析的字符数。如果解析的长度不等于字符串的长度,说明字符串中包含非数字字符。可以通过检查这个值来确定字符串是否只包含数字:std::size_t pos = 0; int value = std::stoi(str, &pos); if (pos < str.size()) { // 字符串包含非数字字符 }
-
使用
std::from_chars
(C++17引入):这是一个新的转换函数,提供了更多的控制和信息。它返回一个结构,其中包含解析的状态和解析的值,可以用来确定转换是否成功以及解析了多少字符:const std::string str = "123haha"; auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value); if (ec == std::errc()) { // 转换成功 }
综上所述,推荐使用std::stoi
的异常处理和解析长度检查来实现更加简洁和安全的转换。对于C++17及以上版本,std::from_chars
提供了一种更现代和灵活的方法来处理字符串到整数的转换。
分享一个有趣的 学习链接