C语言中两个数组求交集时遇到的问题
问题分析与修正方案
你的交集功能存在几个核心问题,同时并集代码也有数组越界的隐患:
- 交集重复输出/存储:当
r中的元素在s里多次出现时,会重复打印该元素,不符合交集元素唯一的定义;而且你只打印了匹配值,没有把结果存入定义好的y数组。 - 并集数组越界:原代码合并
r和s到x时,循环次数超出了两个数组的实际长度,会导致非法内存访问。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> int main() { int r[10]; int s[20]; int x[30]; int y[10]; int i, j, k = 0; // 初始化并打印r数组 for (i = 0; i < 10; i++) { r[i] = rand() % 10; printf("\nR - 位置 %d,数值 %d", i + 1, r[i]); } printf("\n--------------------------------------\n"); // 初始化并打印s数组 for (i = 0; i < 20; i++) { s[i] = rand() % 20; printf("\nS - 位置 %d,数值 %d", i + 1, s[i]); } printf("\n--------------------------------------\n"); // 修正并集:先复制r的10个元素 for (i = 0; i < 10; i++) { x[i] = r[i]; } // 再复制s的20个元素到x的后续位置 for (i = 0; i < 20; i++) { x[i + 10] = s[i]; } // 打印并集x for (i = 0; i < 30; i++) { printf("\nX - 位置 %d,数值 %d", i + 1, x[i]); } printf("\n--------------------------------------\n"); // 修正交集:遍历r数组找匹配项 for (i = 0; i < 10; i++) { int already_in_y = 0; // 先检查当前元素是否已经在交集中,避免重复 for (int m = 0; m < k; m++) { if (y[m] == r[i]) { already_in_y = 1; break; } } if (already_in_y) continue; // 检查是否在s数组中 for (j = 0; j < 20; j++) { if (r[i] == s[j]) { y[k++] = r[i]; // 存入交集数组 printf("\nY - 位置 %d,数值 %d", k, r[i]); break; // 找到一次就退出,避免重复打印 } } } // 无交集时的提示 if (k == 0) { printf("\nY数组中无交集元素"); } return 0; }
关键修改说明
- 并集越界修复:拆分原错误循环,分别按
r和s的实际长度复制元素,避免非法内存访问。 - 交集去重:加入前置检查,确保同一元素不会被多次存入
y数组。 - 结果存储:用变量
k记录交集数组的有效元素数量,把匹配值存入y,而不是仅打印。 - 避免重复输出:找到
s中的匹配项后立即退出内层循环,防止同一元素多次打印。
内容的提问来源于stack exchange,提问作者Gabriel Sá
相关产品推荐
相关产品推荐

