-1

これは RunLength Decoding のための私のプログラムです。しかし、ガベージ値として出力を与えています。メソッドの出力char *decode_rle(char *a,int length)は正しいですが、メイン関数に返されると間違っています。

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

char *decode_rle(char *a,int length)
{
    char op[50];
    int i,j,k=0,count=0;
    for(i=0;i<length;i++)
    {
        if( a[i]=='a' || a[i]=='b' || a[i]=='c' || a[i]=='d' || a[i]=='e' || a[i]=='f' || a[i]=='g')
        {
            count = a[i+1] - '0';
            for(j=0;j<count;j++)
            {
                op[k]=a[i];
                k++;
            }
        }
    }
    op[k] = '\0';
printf("\n the decoded string is %s\n",op);
    return op;
}
int main()
{
    int i=0,j,length,count;
    char a[20],*output;
    printf("\n Enter a string ");
    gets(a);
    printf("\n The string you entered is %s",a);
    length = strlen(a);
    printf("\n length is %d\n",length);
    output = decode_rle(a,length);
    i=0;
    while(output[i]!='\0')
    {
        printf("%c",output[i]);
        i++;
   }
    getch();
    return 0;
}
4

3 に答える 3

1

問題は、関数decode_rleのローカル変数へのポインターを返していることです。これは、その関数から戻ると、もう存在しません。

まず、op を main のローカル変数として宣言し、decode_rle に追加のパラメーターを渡すことをお勧めします。

char *decode_rle(char *a,int length, char *op)
{
    ....
}

int main()
{
    ...
    char op[50];
   ...

    output = decode_rle(a,length, op);
}

これはうまくいきますが...限定された概念実証以上の目的で必要な場合、この演習には他にもいくつかの問題があります。

  • a と p に固定長を使用している場合、ユーザーが gets で 20 を超える文字列を入力するとどうなりますか? デコードされた文字列が 50 より大きい場合はどうなりますか? (c は配列の境界チェックを行わないことを思い出してください。所有していないメモリに書き込むとどうなりますか?)

  • バイナリ 0 をどのように処理しますか? (c の文字列は asciiz 規則を使用して格納されることを思い出してください。圧縮/解凍しようとしているデータ自体にバイナリ 0 が含まれている場合はどうなりますか?この状況を処理するためにバッファーの定義をどのように変更しますか?)

于 2015-05-26T15:58:42.990 に答える
0

スコープが function のみの変数を返そうとしていますdecode_rle。あなたはそれをすることはできず、安全です。関数を終了すると、配列とその内容はプログラムから正式にアクセスできopなくなります

警告付きでコンパイルする必要があります(少しやる気を起こさせるために-Wall追加することもできます)。-Werror

于 2015-05-26T15:37:56.890 に答える