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时,流程完全符合预期:
- 反转得到154并输出
- 541-154=396并输出
- 反转396得到693并输出
- 396+693=1089并输出
不再触发std::invalid_argument异常。
内容的提问来源于stack exchange,提问作者Bread
相关产品推荐
相关产品推荐

