技术汇总记录笔记3:在使用stoi进行string类型转换为字符串时,容易对非纯数字内容转换导致程序崩溃,更加简洁安全的转换是怎样实现的?

在使用std::stoi进行字符串到整数的转换时,确实存在一个问题,即如果字符串包含非数字字符,std::stoi会停止解析并返回解析到的整数部分,这可能导致未被注意到的错误。为了避免这种情况,可以采取以下措施:

  1. 使用异常处理:使用try-catch块来捕获std::stoi可能抛出的std::invalid_argumentstd::out_of_range异常。这可以帮助你识别和处理无法转换为整数的字符串 。

  2. 检查解析长度std::stoi函数的第二个参数可以用来检查解析的字符数。如果解析的长度不等于字符串的长度,说明字符串中包含非数字字符。可以通过检查这个值来确定字符串是否只包含数字:

    std::size_t pos = 0;
    int value = std::stoi(str, &pos);
    if (pos < str.size()) {
        // 字符串包含非数字字符
    }
    
  3. 使用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提供了一种更现代和灵活的方法来处理字符串到整数的转换。


分享一个有趣的 学习链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值