数组首元素未正确转入新数组及数组遍历循环优化问题
数组拆分数字问题:首元素丢失与含0时循环失效
问题1:首元素2丢失的原因
你的for循环增量部分i++ && k++写法错误,导致第一次循环后k没有自增,第二次循环时覆盖了sumdig[0]的初始值:
- 后自增运算符
i++返回的是自增前的数值,第一次循环时i=0,i++返回0 - 逻辑与
&&的短路特性:当左侧为0(假)时,右侧的k++不会执行,所以第一次循环结束后k仍然是0 - 第二次循环处理元素6时,
sumdig[k] = sum[i]%10会把sumdig[0]的2覆盖成6,导致首元素丢失
问题2:含0时循环失效,正确的数组遍历方式
原循环用sum[i]>0作为终止条件,当数组中存在0元素,或者未初始化的数组元素(默认是0)时,循环会提前终止。要遍历数组所有有效元素,有两种可靠方式:
- 直接指定数组的实际元素个数:比如你这里初始化了6个元素,循环条件写成
i < 6 - 使用宏定义或变量记录元素个数,方便后续修改:比如
#define COUNT 6,然后循环i < COUNT
修正后的代码
#include <cs50.h> #include <stdio.h> #include <string.h> #define ELEM_COUNT 6 // 记录数组实际元素个数 int main(void) { int sum[50] = { 2, 6, 3, 10, 32, 64 }; int i, l, k = 0, sumdig[10], dig = 0; // 遍历数组所有有效元素,分开处理i和k的自增,避免短路问题 for (i = 0; i < ELEM_COUNT; i++) { int num = sum[i]; // 用临时变量保存原数值,避免修改原数组 if (num == 0) { // 单独处理0元素 sumdig[k++] = 0; dig++; continue; } // 拆分数字的每一位,支持任意位数 while (num > 0) { sumdig[k++] = num % 10; dig++; num /= 10; } } // 输出测试 for (l = 0; l < dig; l++) { printf("%i\n", sumdig[l]); } }
代码说明
- 用
ELEM_COUNT记录数组实际元素数,彻底避免依赖数组元素值判断循环终止 - 使用临时变量
num保存原数组元素,防止修改原数组影响后续逻辑 - 用
while循环拆分数字,支持处理任意位数的数字(不止原代码的两位) - 单独处理0元素,确保0能被正确存入新数组
修正后的输出
2 6 3 0 1 2 3 4 6
内容的提问来源于stack exchange,提问作者JmsChf
相关产品推荐
相关产品推荐

