我正在尝试制作一个程序,对输入字符串进行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;
}
答案 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
。