C语言数组奇偶分离程序出现随机数问题求助
解决数组奇偶分离后出现随机数的问题
首先,你的代码逻辑大体是对的,但出现随机数通常意味着你访问了未初始化的数组元素。咱们一步步分析可能的问题:
可能的出错点分析
多余的0判断分支(无错误但易混淆)
你代码里专门判断a[i] == 0的分支完全没必要,因为0 % 2 == 0已经会被前面的偶数条件捕获。这部分代码不会导致错误,但会增加代码复杂度,建议删掉简化:// 替换前的冗余代码 if (a[i]%2 == 0) { if (a[i] == 0) { a2[k] = a[i]; k++; continue; } a2[k] = a[i]; k++; } // 简化后 if (a[i] % 2 == 0) { a2[k++] = a[i]; }数组未初始化导致的潜在问题
你定义的a2是局部栈数组,默认不会被初始化。虽然理论上你的代码会把前n个元素都填满,但如果某个环节k的计数没达到n,就会有元素保留栈垃圾值(也就是你看到的随机数)。比如:- 不小心把
k++写成了k(没有递增) - 处理奇数的循环条件写错(比如
i < n-1而不是i < n) - 输入时
n的读取出现异常(比如输入格式错误导致n的值和实际元素数量不匹配)
- 不小心把
输出循环的笔误
如果你的输出循环条件写成了i <= n而不是i < n,会多输出一个未初始化的a2[n],但根据你的描述,输出元素数量是对的,这个可能性较低,但也可以检查一下。
更高效的优化方案(无需额外数组)
其实你可以不用额外数组a2,用双指针法直接在原数组上完成奇偶分离,既节省内存,也避免数组未初始化的问题:
#include <stdio.h> int main() { int a[101]; int n, left = 0, right; scanf("%d", &n); right = n - 1; // 读取数组元素 for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } // 双指针交换奇偶 while (left < right) { // 从左找第一个奇数 while (left < right && a[left] % 2 == 0) { left++; } // 从右找第一个偶数 while (left < right && a[right] % 2 != 0) { right--; } // 交换两者位置 if (left < right) { int temp = a[left]; a[left] = a[right]; a[right] = temp; left++; right--; } } // 输出结果 for (int i = 0; i < n; i++) { printf("%d ", a[i]); } return 0; }
调试建议
如果你还是想用自己的代码,可以给a2初始化,这样即使有未填充的元素,也会输出0而不是随机数,方便排查问题:
int a2[101] = {0}; // 初始化所有元素为0
内容的提问来源于stack exchange,提问作者kasa ssg
相关产品推荐
相关产品推荐

