C语言数组处理:将重复数字后续出现值替换为0、-1、-2…
问题分析与修正方案
原代码存在几个关键问题,导致结果不符合预期:
- 数组越界访问:数组下标范围是
0到size-1,但代码中循环条件用了<=size,会访问数组之外的内存,引发未定义行为。 - 多余的外层循环:最外层的
k循环完全没必要,重复遍历会导致已修改的元素被错误处理。 - count逻辑混乱:每次进入
i循环就重置count,且内层j循环会重复处理同一元素,同时未考虑已修改后的值会干扰后续匹配。 - 语法错误:
a[j]=count末尾缺少分号,无法通过编译。
修正后的代码
以下是实现需求的正确代码:
#include <stdio.h> int main() { int a[] = {1,2,1,2,1,2,1,2,1}; int size = sizeof(a)/sizeof(a[0]); // 遍历每个元素,检查其之前的重复次数 for(int i = 0; i < size; i++){ int repeat_count = 0; // 统计当前元素在之前出现的次数 for(int j = 0; j < i; j++){ if(a[j] == a[i]){ repeat_count++; } } // 非首次出现则按规则替换 if(repeat_count > 0){ a[i] = -(repeat_count - 1); } } // 输出处理后的数组 for(int i = 0; i < size; i++){ printf("%d ", a[i]); } return 0; }
代码说明
- 统计重复次数:对每个元素
a[i],遍历它之前的所有元素,统计相同值的出现次数repeat_count。 - 替换规则:当
repeat_count > 0(即不是第一次出现),按规则替换:- 第2次出现(
repeat_count=1)→ 替换为0 - 第3次出现(
repeat_count=2)→ 替换为-1 - 第4次出现(
repeat_count=3)→ 替换为-2
完全匹配需求中的示例逻辑。
- 第2次出现(
- 避免越界:所有循环边界都使用
< size,确保只访问数组内的有效元素。
测试数组{1,2,1,2,1,2}时,输出结果为1 2 0 0 -1 -1,符合预期;测试{1,1,1}时,输出1 0 -1,也满足要求。
内容的提问来源于stack exchange,提问作者harish
相关产品推荐
相关产品推荐

