Онлайн компилятор C

#include <stdio.h> void change_even_odd(int size, int a[]) { int count = 0; for(int i = 0; i < size; i++) { if (a[i] %2 == 0) { count++; } } int b[size], cymma=0; if (count > 5) { for(int i = 0; i < size; i++) { if (a[i] %2 == 0) { b[i] = a[i]; } else { while(a[i] != 0) { cymma += a[i]%10; a[i]/=10; } b[i] = cymma; cymma = 0; } } } else { for(int i = 0; i < size; i++) { if (a[i] %2 == 0) { while(a[i] != 0) { cymma += a[i]%10; a[i]/=10; } b[i] = cymma; cymma = 0; } else { b[i] = a[i]; } } } for(int i = 0; i < size; i++) { a[i] = b[i]; } } int main() { int size; int a[size] scanf("%d" ,&size); for(int i = 0; i < size; i++) { scanf("%d", &a[i]); } change_even_odd(size, a); return 0; }
这段代码试图根据数组中偶数的个数,对数组元素进行不同的处理:如果偶数个数大于5,则把偶数保留、奇数替换为各位数字之和;否则把偶数替换为各位数字之和、奇数保留。但代码存在几个问题。

- 在 `main` 函数中,`int a[size]` 声明时 `size` 还没有被赋值,导致数组大小未定义。应该先读取 `size`,再声明数组。
- 在 `change_even_odd` 函数中,`b` 数组的索引和 `a` 数组的索引对应关系可能出错:当 `a[i]` 是偶数时,`b[i]` 被赋值,但如果是奇数,`b[i]` 可能没有被赋值(在第一个分支中),导致 `b` 数组某些位置未初始化。
- 在 `while` 循环中修改了 `a[i]` 的值,这会破坏原始数组,影响后续判断或输出。应该使用临时变量计算各位和,而不改变 `a[i]`。