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

#include <stdio.h> int compression(int a[], int b[], int N){ if(N==0){ return 0; } int count=1,save=1; if(a[0]==1){ b[0]=0; } for(int i=1;i<N;i++){ if(a[i]==a[i-1]){ count++; }else{ b[save]=count; save++; count=1; } }b[save]=count; return save; } int main() { int a[]={0,0,0,0,1,1,1,0}; int b[1001]={0}; int answer=0; answer=compression(a,b,10); while(answer!=0){ printf("%d",answer); } return 0; }
这段代码试图实现一种“游程编码”压缩算法,将数组 `a` 中连续相同元素的个数记录到数组 `b` 中。但代码中有几个关键问题。

- 在 `main` 函数中,`compression` 被调用时传入的 `N` 是 `10`,但数组 `a` 只有 `8` 个元素,这会导致访问越界。
- `compression` 函数中,当 `a[0]==1` 时,将 `b[0]` 设为 `0`,这个逻辑不清晰,而且与后续的压缩规则不一致。
- `compression` 函数返回的 `save` 是压缩后 `b` 中有效元素的个数,但 `main` 中用一个 `while` 循环无限打印 `answer`,这会导致死循环。

- 检查 `main` 中调用 `compression` 时传入的 `N` 是否与数组 `a` 的实际长度匹配。
- 思考 `compression` 函数中 `b[0]` 的赋值逻辑:压缩结果通常从 `b[0]` 开始存储第一个连续段的长度,而不是根据 `a[0]` 的值做特殊处理。