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

C语言实现不同长度数字字符串相加结果错误如何解决

大数字符串求和结果异常修复

问题现象

对两个数字字符串"999"和"222"求和时,代码运行输出为221,预期正确结果为1221,原实现代码如下:

char a[100], b[100], jogfol[101];
    scanf("%s %s", &a, &b);
    strrev(a);
    strrev(b);
    //printf("%s %s", a, b);
    int i=0, j=0, k=0, hate=0;
   while(i<=strlen(a) && j<=strlen(b))
    {
        int sum = (a[i]-'0')+(b[i]-'0')+hate;
        jogfol[k] = (sum%10+'0');
        hate = sum/10;
        i++; j++; k++;
        //printf("%d %d %d %d %d %s\n", sum, i, j, k, hate, jogfol);
    }
    while(i<strlen(a))
    {
        int sum = (a[i]-'0')+hate;
        jogfol[k] = (sum%10+'0');
        hate = sum/10;
        i++; k++;
        //printf("%d %d %d %d %s\n", sum, i, k, hate, jogfol);
    }
    printf("\n");
    while(j<strlen(b))
    {
        int sum = (b[j]-'0')+hate;
        jogfol[k] = (sum%10+'0');
        hate = sum/10;
        j++; k++;
        //printf("%d %d %d %d %s\n", sum, j, k, hate, jogfol);
    }

错误点说明

  • 首个累加循环索引错误:取b数组对应位的值时误用i做索引,应使用j
  • 首个累加循环边界错误:C字符串有效索引范围是0 ~ 字符串长度-1,原条件用<=会读取到字符串末尾的\0结束符,参与计算时会得到异常负值
  • 最高位进位丢失:两个数所有位遍历完成后,若进位变量hate不为0,需要存入结果数组,本题中千位的1就是最后剩余的进位
  • 结果顺序错误:初始反转输入串是为了从低位开始累加,结果数组存储顺序是低位在前、高位在后,累加完成后需要再次反转才是正确的数字顺序
  • 结果字符串缺少结束符:C风格字符串必须以\0结尾,否则输出时会读取到数组后的随机内存值,出现乱码或长度异常
  • 语法不规范:scanf读取字符串时,数组名本身就是首地址,不需要额外加&取地址

修复后可运行代码

#include <stdio.h>
#include <string.h>

int main() {
    char a[100], b[100], jogfol[101];
    scanf("%s %s", a, b);
    strrev(a);
    strrev(b);
    int i = 0, j = 0, k = 0, hate = 0;

    // 修正循环边界与b的索引
    while (i < strlen(a) && j < strlen(b)) {
        int sum = (a[i] - '0') + (b[j] - '0') + hate;
        jogfol[k] = (sum % 10) + '0';
        hate = sum / 10;
        i++;
        j++;
        k++;
    }
    // 处理a剩余位
    while (i < strlen(a)) {
        int sum = (a[i] - '0') + hate;
        jogfol[k] = (sum % 10) + '0';
        hate = sum / 10;
        i++;
        k++;
    }
    // 处理b剩余位
    while (j < strlen(b)) {
        int sum = (b[j] - '0') + hate;
        jogfol[k] = (sum % 10) + '0';
        hate = sum / 10;
        j++;
        k++;
    }
    // 处理剩余最高位进位
    if (hate > 0) {
        jogfol[k++] = hate + '0';
    }
    // 补字符串结束符
    jogfol[k] = '\0';
    // 反转得到正确顺序
    strrev(jogfol);

    printf("%s\n", jogfol);
    return 0;
}

验证结果

输入999 222时,代码输出1221,结果正确;对不同长度的数字字符串求和也能得到正确结果。

内容的提问来源于stack exchange,提问作者D-x

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:42:27