-1

这是我的运行长度解码程序。但是将输出作为垃圾值提供。方法中的输出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 长度, char *op)
{
    ……
}

主函数()
{
    ...
    字符运算[50];
   ...

    输出 = decode_rle(a,length, op);
}

这会起作用,但是......如果您需要它来完成有限的概念证明,那么在这个练习中还有其他几个问题。

  • 您正在为 a 和 p 使用固定长度,如果用户在 get 中输入的字符串长度超过 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 回答
0

您返回一个指向 的指针op,它是 中的一个局部变量decode_rle()。当函数返回并且其内存将被重用时,此局部变量超出范围,因此指向该内存的指针不是很有用。

相反,您可以分配所需的内存malloc()并返回一个指向该内存的指针,或者添加一个附加参数到decode_rle()您将指针传递到应该写入结果的内存的位置。

于 2015-05-26T15:38:44.137 回答