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
相关产品推荐
相关产品推荐

