在线编译器 C

#include <stdio.h> enum{size=10}; int main() { int a[size]; for(int i=0;i<size;i++){ scanf("%d",&a[i]); }int num=0,b[num]; while(num<size){ for(int i=0;i<size;i++){ if(a[num]==a[i]){ b[num]++; } }num++; } for(int i=0;i<size;i++){ if(b[i]>=2){ printf("%d ",b[i]); } } return 0; }
这段代码的目的是统计数组中每个数字出现的次数,并输出出现次数大于等于2的数字的次数。但代码存在逻辑错误。

主要问题在于变量 `num` 的初始值为0,而数组 `b` 的大小被声明为 `b[num]`,即 `b[0]`,这是一个长度为0的数组,无法存储任何数据。后续对 `b[num]` 的访问会导致未定义行为。

- 数组 `b` 的大小必须在声明时确定,不能依赖运行时变化的变量 `num`。你需要先确定 `b` 需要多大空间来存储每个数字的出现次数。
- 内层循环中,`b[num]++` 的逻辑有误:当 `a[num]` 等于 `a[i]` 时,你是在对同一个位置 `b[num]` 累加,但这样会重复计数,且没有区分不同数字。实际上,你需要为每个不同的数字单独记录次数,而不是为每个位置 `num` 记录。