C

时间:2015-05-26 15:35:21

标签: c pointers char run-length-encoding

这是我的RunLength Decoding程序。但是将输出作为垃圾值。 char *decode_rle(char *a,int length)方法中的输出是正确的,但是当它返回到main函数时它是错误的。

#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;
}

3 个答案:

答案 0 :(得分: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的固定长度,如果用户输入的字符串超过20,会发生什么?如果解码后的字符串大于50怎么办? (记住c不进行数组边界检查,如果你写在你不拥有的内存上怎么办?)

  • 你如何处理二进制0? (请记住,c中的字符串是使用asciiz约定存储的,如果您尝试压缩/解压缩的数据包含自己的二进制0,会发生什么?如何更改缓冲区的定义以处理这种情况?)

答案 1 :(得分:0)

您正在尝试返回范围仅为函数decode_rle的变量。你不能这样做并且安全。当您退出该函数时,数组op及其内容不再正式可供您的程序访问

您应该使用警告-Wall进行编译(并且您可以添加-Werror来激励您一点)。

答案 2 :(得分:0)

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

相反,您可以使用decode_rle()分配所需的内存并返回指向该内存的指针,或者向 /*Fork #1*/ if((pid=fork())==0) { if(command -> inputRedirect != NULL) { fclose(stdin); fopen(command -> inputRedirect,"r"); } fclose(stdout); dup(pipefd[1]); close(pipefd[1]); i=execvp(command->arguments[0],command->arguments); } if(i == -1) { perror("Error"); return 1; } printf("\nParent: %d , Child: %d\n",getpid(),pid); command = command->next; /*Fork #2*/ if((pid=fork())==0) { fclose(stdin); dup(pipefd[0]); close(pipefd[0]); if(command -> outputRedirect != NULL) { fclose(stdout); fopen(command ->outputRedirect,"w"); } i=execvp(command->arguments[0],command->arguments); _exit(0); } if(i == -1) { perror("Error"); return 1; } if(command->blocking == 1) { int test=0; printf("\nParent: %d , Child: %d\n",getpid(),pid); printf("\ntest1\n"); while((test=wait(NULL)) != pid) { printf("\n %d \n ", test); } printf("\ntest2\n"); } return 0; } 添加一个附加参数,您可以将指针传递给应该写入结果的内存。