-1

我正在尝试制作一个对提供给用户的输入字符串进行 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;
}
4

2 回答 2

1

一个错误在这里:

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

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

另一个错误是由于以下方面的双重增量:

        for (j=i; str[j]==str[j++]; j++ ) sum++;
                              ^^^   ^^^
于 2013-01-07T19:31:07.010 回答
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循环的 step 部分增加。

于 2013-01-07T19:34:06.023 回答