-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

すぐにわかることの 1 つは、j反復ごとに 2 回インクリメントしていることです。おそらくあなたはstr[j] == str[j+1]条件として意味していました。ただし、それを行ったとしても、そのネストされたループでは、配列の範囲外の領域に到達できます。上記の条件が真であるだけでなく、有効な範囲内にあること確認する必要があります。str[j]

後で、あなたは言います

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

それは間違いなくあなたが望むものではありません。あなたが望むのはおそらくstr_out[k++]両方の割り当てにあります。そうしないと、2 番目の割り当てが最初の割り当てをキャンセルします。

また、sumが に等しい場合1、繰り返し回数は保存せず、文字のみを保存します。結果の配列をデコードするコードはカウントと値を区別できないため、それがあなたの望むものであるとは思えません。したがって、if両方のケースで (無条件に) body を使用することをお勧めします。

また、別の回答で述べたようにi、外側のループのステップ部分でインクリメントしていないため、最初のループは永遠に続きforます。

于 2013-01-07T19:34:06.023 に答える
1

ここに 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 に答える