如何在c中解压缩char数组

我需要创建function:

char * decompress(const char * src) { } 

这个函数的输入是一些字符串:

 Hello world! -> Hello world! Hel2o world!10" -> Hello world!!!!!!!!!! 

正如你可以看到,如果有一些数字,它会重复前一个char这个数字次。 我是java程序员,但现在我需要在c中解决这个问题;

我现在有这个。 它只是打印我希望正确的值,但我不知道如何将其分配给返回指针

 #include  #include  #include  #include  #include  char * decompress(const char * src) { int max = 0; int pom = 1; char *vysledek = ""; int i; for (i = 0; i < strlen(src); i++) { max = 0; pom = 1; while (isdigit(src[i])) { int digit = (src[i] - '0'); max = max * 10 + digit; i++; pom++; } if (max == 0) { max = 1; } int j; for (j = 0; j < max; j++) { printf("%c", src[i - pom]); } } return vysledek; } int main(int argc, char * argv []) { decompress("Hel2o world!10"); return 0; } 

既然你提到你是一个Java程序员,你应该研究C内存赋值(在这种情况下特别是字符串)是如何工作的:

 char *vysledek = ""; 

在Java中,这将创建一个字符串对象,您可以随意添加字符。 但是,在C中,这将基本上创建一个char[1]数组,其中包含'\0' (字符串终止符)。

因为 – 就像Java的数组 – 你不能(不应该)在数组的边界外写入,你可以在这个数组中存储一个字符,这对你的函数来说没有足够的内存。

你可以通过首先迭代输入来找出你需要分配多少内存(正如Nit在他的评论中提到的)。 然后你可以为你的输出指针malloc必要的内存:

 vysledek = malloc (); 

现在您已经分配了足够的内存,您可以将输出写入此数组,而不是

 printf("%c", src[i - pom]); 

你现在可以写:

 vysledek[vysledek_counter++] = src[i - pom]; 

并返回指针。

请注意,在使用完毕后,您应该释放返回的值,即使它位于main方法的末尾,它应该如下所示:

 int main(int argc, char * argv []) { char *output; output = decompress("Hel2o world!10"); printf("%s\n", output); free(output); return 0; } 

要添加的另一个注意事项:如果遇到非终止字符串(即没有'\0'字符表示字符串结束),您的代码将失败。 要解决此问题,请传递一个额外的字符串长度参数(您必须在返回的char数组中自己设置'\0'字符,并为此指针保留一个额外的内存字节)。 它在第一次迭代时也有未定义的行为(正如Cool Guy指出的那样),因为pom总是至少为1,导致i - pom ,因此试图访问src[-1]