同一输入下C语言数组去重程序输出不一致的原因排查
C语言数组去重程序输出不一致问题排查
我编写了一段C语言代码,实现读取数组元素、去除重复项并将非重复元素存入新数组(不修改原数组),分别输出去重后的新数组和原数组。但发现相同输入下程序输出结果不一致,附上代码及多组测试输出,请求排查原因。
原代码
#include <stdio.h> void fun(int *, int size, int *, int *new_size); int main() { int size, new_size; // 变量声明 printf("Enter the size : "); // 提示用户输入数组大小 scanf("%d", &size); // 读取数组大小 int arr[size], arr1[size]; // 声明对应大小的数组 printf("Enter the elements into the array: "); // 提示用户输入数组元素 for (int i = 0; i < size; i++) { scanf("%d", arr + i); // 读取数组元素 } fun(arr, size, arr1, &new_size); // 调用去重函数 printf("After removing duplicates: "); // 输出去重后的新数组提示 for (int i = 0; i < new_size; i++) { printf("%d ", arr1[i]); } printf("\n"); printf("before removing duplicates: "); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } void fun(int *arr, int size, int *arr1, int *new_size) // 去重函数定义 { int count = 1; // 变量声明 arr1[0] = arr[0]; for (int i = 0; i < size; i++) { int flag = 0; for (int j = 0; j < i; j++) { if (arr[i] == arr1[j]) { break; } flag = flag + 1; if (arr1[flag] == 0) { *(arr1+flag) = arr[i]; count = count + 1; } } } *new_size = count; }
测试输出
测试用例1(正常输出)
Enter the size : 5 Enter the elements into the array: 5 1 2 1 2 After removing duplicates: 5 1 2 before removing duplicates: 5 1 2 1 2
测试用例2(无重复元素,正常输出)
Enter the size : 5 Enter the elements into the array: 5 4 3 2 1 After removing duplicates: 5 4 3 2 1 before removing duplicates: 5 4 3 2 1
测试用例3(输出异常)
Enter the size : 5 Enter the elements into the array: 5 1 2 1 2 After removing duplicates: 5 1 6 before removing duplicates: 5 1 2 1 2
问题原因分析
你的fun函数存在多处逻辑错误,这是导致输出不一致的核心原因:
- 重复判断逻辑错误:内层循环
j遍历的范围是0到i-1(原数组的索引),但实际应该遍历arr1中已经存入的非重复元素(范围是0到count-1),这样才能正确判断当前arr[i]是否已经存在于新数组中。 - 依赖未初始化的数组值:代码中通过
arr1[flag] == 0来判断是否添加元素,但arr1是局部自动数组,未初始化时内部存储的是随机垃圾值,不是固定的0,这就导致了偶尔出现随机数(比如测试用例3中的6)的情况。 - 元素添加时机错误:你在内层循环中每次
flag自增后就尝试添加元素,这完全不符合去重逻辑——正确的逻辑应该是:当确认当前arr[i]在arr1的所有已存元素中都没有重复时,再将其添加到arr1的末尾,并增加count。
修正后的fun函数
void fun(int *arr, int size, int *arr1, int *new_size) { if (size == 0) { *new_size = 0; return; } int count = 1; arr1[0] = arr[0]; for (int i = 1; i < size; i++) { // 从第二个元素开始遍历原数组 int is_duplicate = 0; // 遍历新数组中已有的非重复元素,判断是否重复 for (int j = 0; j < count; j++) { if (arr[i] == arr1[j]) { is_duplicate = 1; break; } } // 如果不是重复元素,添加到新数组末尾 if (!is_duplicate) { arr1[count] = arr[i]; count++; } } *new_size = count; }
修正说明
- 外层循环从
i=1开始,因为第一个元素已经存入arr1,无需重复处理。 - 内层循环遍历
arr1中已有的count个元素,确保正确判断重复。 - 用
is_duplicate标记位来确认当前元素是否重复,只有不重复时才添加到arr1末尾,同时更新count。 - 增加了空数组的边界判断,避免越界。
内容的提问来源于stack exchange,提问作者Quill
相关产品推荐
相关产品推荐

