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

C语言中如何用指针修改并比较数组值?代码问题求助

C语言指针实现数组去重错误排查与修正

常见错误分析

1. 比较逻辑疏漏

多数初学者会只让当前元素与原数组前一个元素对比,而非和新数组中已存入的所有元素逐一校验,这种逻辑仅能去除连续重复值,无法处理非连续的重复元素。

2. 指针操作失误

  • 新数组的指针未正确初始化或移动,导致元素被覆盖或无法正常写入
  • 未控制原数组的遍历边界,出现指针越界访问的情况

3. 输出逻辑错误

输出时沿用原数组长度遍历新数组,而非使用新数组的实际有效长度,导致末尾出现垃圾值


错误代码示例(典型场景)

假设你的代码类似以下写法:

#include <stdio.h>

void removeDuplicates(int *arr, int len, int *newArr, int *newLen) {
    if (len == 0) {
        *newLen = 0;
        return;
    }
    int *p = arr;
    int *q = newArr;
    *q++ = *p++;
    *newLen = 1;
    while (p < arr + len) {
        // 错误:仅和新数组最后一个元素比较,无法处理非连续重复
        if (*p != *(q - 1)) {
            *q++ = *p;
            (*newLen)++;
        }
        p++;
    }
}

int main() {
    int arr[] = {1, 2, 2, 3, 1, 4, 4};
    int len = sizeof(arr) / sizeof(arr[0]);
    int newArr[10];
    int newLen;
    removeDuplicates(arr, len, newArr, &newLen);
    // 错误:用原数组长度遍历新数组,输出多余垃圾值
    for (int i = 0; i < len; i++) {
        printf("%d ", newArr[i]);
    }
    return 0;
}

实际错误输出

1 2 3 1 4 0 0

预期输出

1 2 3 4


错误修复方案

1. 修正比较逻辑

遍历原数组时,每个元素需和新数组中已存入的所有元素逐一比对,确认无重复后再写入:

// 替换原while循环内的逻辑
while (p < arr + len) {
    int *temp = newArr;
    int isDuplicate = 0;
    // 遍历新数组已有的有效元素
    while (temp < q) {
        if (*p == *temp) {
            isDuplicate = 1;
            break;
        }
        temp++;
    }
    if (!isDuplicate) {
        *q++ = *p;
        (*newLen)++;
    }
    p++;
}

2. 修正输出遍历范围

输出新数组时,使用新数组的实际有效长度newLen:

// 替换main函数中的for循环
for (int i = 0; i < newLen; i++) {
    printf("%d ", newArr[i]);
}

修正后完整代码

#include <stdio.h>

void removeDuplicates(int *arr, int len, int *newArr, int *newLen) {
    if (len == 0) {
        *newLen = 0;
        return;
    }
    int *p = arr;
    int *q = newArr;
    *q++ = *p++;
    *newLen = 1;
    while (p < arr + len) {
        int *temp = newArr;
        int isDuplicate = 0;
        while (temp < q) {
            if (*p == *temp) {
                isDuplicate = 1;
                break;
            }
            temp++;
        }
        if (!isDuplicate) {
            *q++ = *p;
            (*newLen)++;
        }
        p++;
    }
}

int main() {
    int arr[] = {1, 2, 2, 3, 1, 4, 4};
    int len = sizeof(arr) / sizeof(arr[0]);
    int newArr[10];
    int newLen;
    removeDuplicates(arr, len, newArr, &newLen);
    for (int i = 0; i < newLen; i++) {
        printf("%d ", newArr[i]);
    }
    return 0;
}

运行结果(符合预期)

1 2 3 4


内容的提问来源于stack exchange,提问作者Kenneth Barth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:15:34