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
相关产品推荐
相关产品推荐

