You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一输入下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函数存在多处逻辑错误,这是导致输出不一致的核心原因:

  1. 重复判断逻辑错误:内层循环j遍历的范围是0到i-1(原数组的索引),但实际应该遍历arr1中已经存入的非重复元素(范围是0到count-1),这样才能正确判断当前arr[i]是否已经存在于新数组中。
  2. 依赖未初始化的数组值:代码中通过arr1[flag] == 0来判断是否添加元素,但arr1是局部自动数组,未初始化时内部存储的是随机垃圾值,不是固定的0,这就导致了偶尔出现随机数(比如测试用例3中的6)的情况。
  3. 元素添加时机错误:你在内层循环中每次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:31:02