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

#include <stdio.h> int compression(int a[], int b[], int N){ if(N==0){ return 0; } int count=1,save=0; if(a[0]==1){ b[save]=0; } for(int i=1;i<N;i++){ if(a[i]==a[i-1]){ count++; }else{ b[save++]=count; count=1; } }b[save]=count; return save; } int main() { int a[]={}; int b[1001]={0}; int answer=0; answer=compression(a,b,10); while(answer!=0){ printf("%d",answer); } return 0; }
这段代码试图实现一个“游程编码”压缩功能:统计数组 `a` 中连续相同数字的个数,并将这些计数存入数组 `b`。但代码中存在几个问题。

- 主函数中 `int a[]={};` 定义了一个空数组,但后面调用 `compression(a,b,10)` 时却传入了长度10,这会导致访问越界,因为数组 `a` 根本没有10个元素。
- `compression` 函数中,当 `a[0]==1` 时,你向 `b[0]` 写入了0,但根据逻辑,这里应该处理的是第一个连续段的计数,而不是特殊判断。这个特殊判断会破坏压缩结果。
- 主函数最后的 `while` 循环会无限打印 `answer`,因为 `answer` 的值在循环内没有改变。而且 `answer` 是 `compression` 返回的索引值,不是压缩后的数据,打印它没有意义。

- 检查 `compression` 函数中 `if(a[0]==1)` 这一行,思考它是否真的符合压缩逻辑。压缩应该对每个连续段都记录计数,而不是只对值为1的段做特殊处理。
- 主函数中 `a` 数组的定义和 `compression` 调用时的长度参数不匹配。你需要确保数组 `a` 有足够的元素,并且传入的长度是实际元素个数。