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

自然数字符串求和程序异常:修改输入字符串后结果仍不符合预期

解决自然数求和程序的问题

看起来你在处理以+连接的自然数求和时踩了几个常见的C++编程坑,我帮你梳理下问题点,再给出修正后的完整方案:

你的代码里的核心问题

  • 变量未声明:i和temp没有提前定义,C++是强类型语言,必须先声明变量才能使用,否则会编译报错。
  • 内层循环越界访问:最后一个数字后面没有+或-,你的内层循环会一直读取到字符串结束符之外的内存区域,触发未定义行为,导致最后一个数字处理异常。
  • 未实现总和累加:代码只是打印了临时读取的数字,但没有把这些数字加起来得到最终的总和,不符合需求。
  • 字符串截断的错误逻辑:处理最后一个数字时,s+i+1会指向字符串结束符的下一个位置,调用strcpy会导致非法内存访问,这也是程序行为异常的原因之一。
  • 缺少必要头文件:使用strlen、strcpy需要包含<cstring>,使用cout需要包含<iostream>,否则这些标准库函数无法正常使用。

修正后的完整代码

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    // 可以替换成用户输入的字符串,比如用cin读取
    char s[100] = "39+72+15";
    int sum = 0;       // 存储最终总和
    int temp = 0;      // 临时存储当前读取的数字
    int i = 0;
    int len = strlen(s); // 提前计算字符串长度,避免重复调用strlen

    while (i < len) {
        // 读取当前连续的数字字符,直到遇到+或字符串结束
        while (i < len && s[i] != '+') {
            temp = temp * 10 + (s[i] - '0');
            i++;
        }
        // 将当前数字加到总和里
        sum += temp;
        cout << "当前读取的数字: " << temp << endl;
        // 重置临时变量,跳过+号
        temp = 0;
        i++;
    }

    cout << "所有数字的总和为: " << sum << endl;
    return 0;
}

关键修改说明

  1. 变量规范:提前声明并初始化了所有需要的变量,包括用于存储总和的sum,避免编译错误。
  2. 循环逻辑优化:用索引i遍历字符串,不再修改原始字符串(原代码的strcpy操作容易出错),通过i < len确保不会越界访问内存。
  3. 内层循环终止条件:新增i < len的判断,保证读取数字时不会超出字符串范围,完美处理最后一个没有+结尾的数字。
  4. 总和累加逻辑:每次读取完一个数字后,立即将其加到sum中,最终输出计算结果。
  5. 可选的动态输入:如果需要支持用户输入字符串,可以把固定的字符串初始化替换成:
    char s[100];
    cout << "请输入以+连接的自然数字符串: ";
    cin >> s;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:30:36