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

字符数组数字求和代码异常求助:部分测试用例计算结果错误

问题分析与修复方案

嘿,我帮你找出代码出问题的地方啦!你的程序在大部分情况下正常,但遇到andre54e5这类输入时出错,核心是两个关键问题:

1. 字符串缺少终止符,导致atoi转换出错

你的getnr函数把提取的数字字符存入sir数组后,没有添加字符串终止符'\0'。而atoi函数要求输入的字符串必须以'\0'结尾,否则会读取内存里的随机垃圾数据,结果完全不可控。

比如处理andre54e5的最后一个5时,sir里只存了'5',但没有'\0',atoi会顺手读取之前调用getnr留下的'54',把单个5错误转换成54,总和就变成了54+54=108,正好是你看到的错误结果。

修复这个问题只需要加一行代码:

int getnr(char a[], int i, int j) {
 int counter = 0;
 char sir[1000];
 for (int x = i; x<j; x++) {
 sir[counter] = a[x];
 counter++;
 }
 sir[counter] = '\0'; // 必须添加终止符,让atoi知道字符串结束
 return atoi(sir);
}

2. 主循环逻辑冗余,还可能引发潜在问题

你主循环里,当i是最后一个数字字符时,会先执行一次求和,再进入内层循环——但此时内层循环根本不会运行,属于冗余代码。另外,每次循环都调用strlen(a)会重复遍历字符串,效率很低,不如先把长度存起来复用。

优化后的主循环更简洁清晰:

int main() {
 char a[1000];
 int s = 0;
 cin.getline(a, 255);
 int len = strlen(a); // 先存字符串长度,避免重复计算
 for (int i = 0; i < len; i++) {
 if (isdigit(a[i]) ) {
 int j;
 // 找到当前数字序列的结束位置
 for (j = i + 1; j < len; j++) {
 if (!isdigit(a[j])) {
 break;
 }
 }
 // 提取从i到j-1的数字序列
 s += getnr(a, i, j);
 i = j - 1; // 跳过已经处理过的数字,避免重复遍历
 }
 }
 cout << s;
 return 0;
}

测试验证

修改后再测试:

  • 输入andre54e5,会正确提取54和5,总和59;
  • 输入dasn344wee22ee,依然得到344+22=366,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:26