RLE压缩在c

时间:2013-01-07 19:24:23

标签: c

我正在尝试制作一个程序,对输入字符串进行RLE压缩,但是当我尝试运行它时,我会出现分段错误,但我不知道我的错误在哪里...

这是我的代码:

#include <stdio.h>
#include <string.h>

char * rle_convert(char str[500]);

char str_out[500];

int main(void) {
    char str[500];
    printf("give a string : ");
    fgets (str, 500, stdin );
    strcpy(str,rle_convert(str));
    printf("%s",str);
}

char * rle_convert(char str[500]) {
    int i,j,k=0,sum;
    for (i=0; i<(strlen(str)-1); i+sum) {
            sum=1;
            for (j=i; str[j]==str[j++]; j++ ) sum++;
            if (sum>1) {
                    str_out[k]=sum+48;
                    str_out[k++]=str[i];
            }
            else str_out[k]=str[i];
            k++;
    }
    return str_out;
}

2 个答案:

答案 0 :(得分:1)

这里有一个错误:

for (i=0; i<(strlen(str)-1); i+sum) {
                             ^^^^^

你的意思是写i += sum吗?

另一个错误是由于双重增加:

        for (j=i; str[j]==str[j++]; j++ ) sum++;
                              ^^^   ^^^

答案 1 :(得分:1)

我立即看到的一件事是你在每次迭代中增加j两次。也许你的意思是str[j] == str[j+1]。但是,即使你这样做,在那个嵌套循环中你仍然可以从数组的边界到达领域。您需要确保不仅上述条件为真,而且 str[j]仍在有效范围内。

稍后,你说

str_out[k]=sum+48;
str_out[k++]=str[i];

这绝对不是你想要的。在两个作业中你想要的可能是str_out[k++],否则第二个作业会取消第一个作业。

然后,如果sum等于1,则不保存重复次数,只保存字符。我怀疑这是你想要的,因为解码结果数组的代码将无法区分计数和值。因此,您可能希望在两种情况下使用if正文(非条件)。

另外,正如另一个答案中所提到的,第一个循环将永远持续,因为你没有在外部i循环的步骤部分递增for