如何在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]
。