Online Compiler 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!='\0';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,1,1,1,1,0,0,1,1}; int b[1001]={0}; int answer=0; answer=compression(a,b,15); for(int i=0;i<1001;i++){ printf("%d",answer); } return 0; }
这段代码试图实现一种“游程编码”压缩:统计数组 `a` 中连续相同数字的个数,并将这些计数存入数组 `b`。但代码中存在几个关键问题。

- 循环条件 `i!='\0'` 是错误的。`'\0'` 是空字符(值为0),而数组 `a` 中可能包含0值,这会导致循环在遇到0时提前终止,而不是遍历整个数组。你应该用传入的长度 `N` 来控制循环次数。
- 在 `main` 函数中,你打印了 `answer` 1001次,但 `answer` 是压缩后返回的索引值(即 `save` 的值),而不是压缩后的数据。你应该遍历数组 `b` 并打印 `b[i]` 的值。
- 另外,当 `a[0]==1` 时,你向 `b[0]` 写入了0,这个逻辑看起来是为了处理第一个元素是1的情况,但需要确认这是否符合你的压缩规则。通常游程编码会记录每个连续段的长度,包括0和1的段。