在线编译器 C

#include <stdio.h> int compression(int a[], int b[], int N){ 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; save++; } }b[save]=count; return count; } int main() { int a[]="0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1"; compression(a,b,10); return 0; }
这段代码试图实现游程编码(Run-Length Encoding),但存在多个问题。

代码的主要思路是:遍历数组 `a`,统计连续相同数字的个数,当数字变化时,将计数存入数组 `b`。但实现中有几个关键错误。

- 在 `main` 函数中,`a` 被初始化为一个字符串,而不是整数数组。字符串 `"0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1"` 实际上是一个字符数组,包含数字字符、空格等,而不是你想要的整数0和1。你需要用整数数组来存储这些数字。

- 变量 `b` 在 `main` 中没有定义就被使用。你需要先声明一个足够大的数组来存放压缩后的结果。

- `compression` 函数中,当遇到数字变化时,你把 `count` 存入 `b[save]`,但之后没有重置 `count` 为1,导致下一个连续段的计数从之前的累计值开始,而不是从1开始。

- 函数返回的是最后一个连续段的计数 `count`,而不是压缩后的长度。通常这种函数应该返回压缩后的数据个数(即 `save+1` 或类似的值)。