这是我的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;
}
答案 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;
}
添加一个附加参数,您可以将指针传递给应该写入结果的内存。