输入两组整数提取重复元素的C++程序异常终止问题排查
问题分析与修复方案
核心错误原因
- 未初始化变量导致逻辑崩溃:代码中
int arr[100], size1, size2, size3 = size1 + size2;这一行存在严重问题——size1和size2定义时未初始化,它们的值是内存中的随机垃圾值,因此size3的初始值完全不可控。输入第二组数据时,循环for (int i = size1; i < size3; i++)的终止条件是随机数,大概率会导致循环提前结束或数组越界,直接引发程序异常终止。 - 未初始化的visited数组:
int visited[size3];属于非标准的变长数组(仅部分编译器支持),且未初始化,数组内元素为随机值。判断if (visited[i] != 1)时会出现误判,导致重复输出或漏判重复元素。
修复后的代码
#include <iostream> #include <cstring> // 用于memset初始化数组 using namespace std; void swap(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void sortArray(int arr[], int size) { int i, j, min; for (i = 0; i < size - 1; i++) { min = i; for (j = i + 1; j < size; j++) { if (arr[j] < arr[min]) { min = j; } } if (min != i) { swap(&arr[min], &arr[i]); } } } int main() { int arr[100], size1, size2, size3; // 输入第一组数据 cin >> size1; for (int i = 0; i < size1; i++) { cin >> arr[i]; } // 输入第二组后再计算总长度,避免未初始化变量问题 cin >> size2; size3 = size1 + size2; for (int i = size1; i < size3; i++) { cin >> arr[i]; } sortArray(arr, size3); cout << "Answer:"; // 初始化visited数组为0,避免随机值干扰判断 int visited[100]; memset(visited, 0, sizeof(visited)); for (int i = 0; i < size3; i++) { if (visited[i] != 1) { int count = 1; for (int j = i + 1; j < size3; j++) { if (arr[i] == arr[j]) { count++; visited[j] = 1; } } if (count > 1) { cout << " " << arr[i]; // 调整输出格式,避免末尾多余空格 } } } cout << endl; return 0; }
额外优化建议
- 用
std::vector替代固定大小数组,更灵活且符合C++现代编程规范,避免数组容量限制问题。 - 替换手写选择排序为
std::sort,效率更高且代码更简洁。 - 可通过标志位或结果集合优化输出,彻底避免末尾多余空格。
内容的提问来源于stack exchange,提问作者Mariofan717
相关产品推荐
相关产品推荐

