自然数字符串求和程序异常:修改输入字符串后结果仍不符合预期
解决自然数求和程序的问题
看起来你在处理以+连接的自然数求和时踩了几个常见的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; }
关键修改说明
- 变量规范:提前声明并初始化了所有需要的变量,包括用于存储总和的
sum,避免编译错误。 - 循环逻辑优化:用索引
i遍历字符串,不再修改原始字符串(原代码的strcpy操作容易出错),通过i < len确保不会越界访问内存。 - 内层循环终止条件:新增
i < len的判断,保证读取数字时不会超出字符串范围,完美处理最后一个没有+结尾的数字。 - 总和累加逻辑:每次读取完一个数字后,立即将其加到
sum中,最终输出计算结果。 - 可选的动态输入:如果需要支持用户输入字符串,可以把固定的字符串初始化替换成:
char s[100]; cout << "请输入以+连接的自然数字符串: "; cin >> s;
内容的提问来源于stack exchange,提问作者Miki
相关产品推荐
相关产品推荐

