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

C语言重复元素消除实验代码调试求助

C语言数组去重问题:多重复输入错误排查与修复

需求说明

读取10个范围在[10,100]的整数,每读取一个数,仅当它不是已读取数的重复值时才打印。需考虑最坏情况(10个数均不同),使用最小规模的数组。

现有代码核心问题分析

你的代码存在多处逻辑错误,导致多重复输入时输出异常:

  1. isDuplicate函数逻辑错误:
    • 遍历整个initialArray(固定SIZE=10),但数组中只有前locCtr个元素是有效输入,其余为未初始化的垃圾值,会导致误判重复;
    • 单次重复输入调用两次isDuplicate,导致重复打印"Duplicate found!"。
  2. removeElement函数完全偏离需求:
    • 函数仅过滤数组中的0值,未实现"移除重复元素"的逻辑,无法正确生成去重后的数组;
    • 每次调用都会分配新内存,但未释放旧的newArray,造成内存泄漏。
  3. newArray维护逻辑缺失:
    • 仅初始化第一个元素,后续非重复元素未同步更新到newArray;
    • 用newSize = SIZE - 重复次数的方式维护数组大小,未跟踪实际有效去重元素的数量,导致数组越界或读取垃圾值。
  4. printArray函数循环错误:
    • 循环范围i < SIZE - 1会漏掉倒数第二个元素,打印格式存在缺陷。

修复后的完整代码

header.h

int isDuplicate(int* array, int count, int input);
void printArray(int* array, int size);

functions.c

#include <stdio.h>
#include "header.h"

// 判断input是否在array的前count个元素中重复
int isDuplicate(int* array, int count, int input) {
    for (int i = 0; i < count; i++) {
        if (array[i] == input) {
            return 1;
        }
    }
    return 0;
}

// 正确打印数组所有元素
void printArray(int* array, int size) {
    if (size == 0) {
        printf("[]\n");
        return;
    }
    printf("[%d", array[0]);
    for (int i = 1; i < size; i++) {
        printf(" %d", array[i]);
    }
    printf("]\n");
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

int main() {
    // initialArray存储所有输入(含重复),最坏情况10个元素
    int* initialArray = malloc(sizeof(int) * 10);
    // newArray存储去重后的元素,初始按最坏情况分配10个元素空间
    int* newArray = malloc(sizeof(int) * 10);
    int input = 0;
    // 已输入的总个数(含重复)
    int inputCount = 0;
    // 去重后的有效元素个数
    int uniqueCount = 0;

    printf("Welcome! Please enter your 10 numbers, between 10 and 100, inclusive!\n");
    while (inputCount < 10) {
        scanf("%d", &input);
        if (input >= 10 && input <= 100) {
            // 先把输入存入initialArray
            initialArray[inputCount] = input;
            // 判断是否是重复值(只检查已去重的元素)
            if (!isDuplicate(newArray, uniqueCount, input)) {
                printf("Value: %d\n", input);
                newArray[uniqueCount] = input;
                uniqueCount++;
            } else {
                printf("Duplicate found!\n");
            }
            inputCount++;
        } else {
            printf("Invalid input! Please enter your numbers in the interval of [10,100]!\n");
        }
    }

    printf("Your initial array is: ");
    printArray(initialArray, 10);

    printf("Your final array is: ");
    printArray(newArray, uniqueCount);

    printf("Bye bye!\n");

    // 释放内存
    free(initialArray);
    free(newArray);

    return 0;
}

修复逻辑说明

  1. 简化去重判断:直接用newArray(已去重的元素)来判断新输入是否重复,避免遍历无效的未初始化内存;
  2. 维护有效元素计数:用uniqueCount跟踪去重后的元素数量,无需每次重复都重新分配数组,内存使用更高效;
  3. 避免内存泄漏:仅在初始时分配一次数组空间,无需频繁调用malloc/realloc,最后统一释放;
  4. 修正打印逻辑:确保数组所有元素都被正确打印,处理空数组的边界情况。

测试验证

用你的测试案例输入:

10
20
30
40
40
50
50
60
75
80

输出结果:

Welcome! Please enter your 10 numbers, between 10 and 100, inclusive!
Value: 10
Value: 20
Value: 30
Value: 40
Duplicate found!
Value: 50
Duplicate found!
Value: 60
Value: 75
Value: 80
Your initial array is: [10 20 30 40 40 50 50 60 75 80]
Your final array is: [10 20 30 40 50 60 75 80]
Bye bye!

内容的提问来源于stack exchange,提问作者Phoebus Apollon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:54:56