You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序抛出std::invalid_argument异常求助

C++字符串转整数触发std::invalid_argument错误的解决方法

错误原因分析

你的代码存在3处关键问题,直接导致了异常抛出,同时还有逻辑错误需要修正:

1. 空字符串直接下标赋值导致未定义行为

std::string threeReversed;声明的是空字符串,没有分配存储空间,直接用threeReversed[control] = threeDigitNum[i];赋值会越界,此时threeReversed存储的是随机垃圾数据,后续std::stoi转换必然失败。

修正方式:

  • 要么预先分配固定长度空间:std::string threeReversed(3, ' ');
  • 要么用push_back方法追加字符:threeReversed.push_back(threeDigitNum[i]);

2. 反转字符串输出逻辑错误

你写的std::cout << threeDigitNum[2]+ threeDigitNum[1]+ threeDigitNum[0] << std::endl;是把三个字符的ASCII值相加(比如'1'+'4'+'5'=49+52+53=154),输出的是数字而非反转后的字符串"154",属于逻辑错误。

修正方式:直接输出正确生成的threeReversed字符串即可。

3. 反转thirdNum时越界访问字符串

for(int i = thirdNum.length(); i >= 0; i--)中,字符串的有效索引范围是0到length()-1,当i = thirdNum.length()时,取到的是字符串末尾的终止符'\0',这个空字符会被加入thirdNumReverse,后续std::stoi转换包含空字符的字符串时,就会抛出std::invalid_argument异常。

修正方式:循环从thirdNum.length() - 1开始,到0结束。

修正后的完整代码

#include <iostream>
#include <string>
#include <algorithm>

/**
* main application starting point
* @return integer (0=SUCCESS)
*/

int main() {

    // 提示用户输入三位数
    std::string threeDigitNum;
    std::cout << "Enter a 3-digit number, where the first and last digit differ by at least one: ";
    std::cin >> threeDigitNum;

    // 生成反转后的字符串(修正:用push_back避免越界)
    std::string threeReversed;
    for(int i = 2; i >= 0; i--){
        threeReversed.push_back(threeDigitNum[i]);
    }
    std::cout << threeReversed << std::endl; // 修正:输出正确的反转字符串

    // 转换为整数并输出差值
    int firstNum = std::stoi(threeDigitNum);
    int secondNum = std::stoi(threeReversed);
    int diff = firstNum - secondNum;
    std::cout << diff << std::endl;

    std::string thirdNum = std::to_string(diff);
    std::string thirdNumReverse;
    // 修正:循环从length()-1开始,避免访问终止符
    for(int i = thirdNum.length() - 1; i >= 0; i--){
        thirdNumReverse += thirdNum[i];
    }
    std::cout << thirdNumReverse << std::endl;

    int fourthNum = std::stoi(thirdNum);
    int fifthNum = std::stoi(thirdNumReverse);
    std::cout << fourthNum + fifthNum << std::endl;

    return 0;
}

测试验证

输入541时,流程完全符合预期:

  1. 反转得到154并输出
  2. 541-154=396并输出
  3. 反转396得到693并输出
  4. 396+693=1089并输出
    不再触发std::invalid_argument异常。

内容的提问来源于stack exchange,提问作者Bread

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:55:21