我需要创建函数:
char * decompress(const char * src) {
}
此函数的输入是一些字符串:
Hello world! -> Hello world!
Hel2o world!10" -> Hello world!!!!!!!!!!
你可以看到,如果有一些数字,它会重复前一个char这个数字次。我是java程序员,但现在我需要在c中解决这个问题;
我现在有这个。它只是打印我希望正确的值,但我不知道如何将它分配给返回指针
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
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;
}
答案 0 :(得分:1)
既然您提到自己是Java程序员,那么您应该研究C内存赋值(在本例中尤其是字符串)的工作方式:
char *vysledek = "";
在Java中,这将创建一个字符串对象,您可以随意添加字符。但是,在C中,这将基本上创建一个char[1]
数组,其中包含'\0'
(字符串终止符)。
由于 - 像Java的数组一样 - 你不能(不应该)在数组的边界外写入,你可以在这个数组中存储一个字符,这对你的函数来说没有足够的内存。
你可以通过首先迭代输入来找出你需要分配多少内存(正如Nit在他的评论中提到的)。然后你可以malloc
输出指针所需的内存:
vysledek = malloc (<output string length>);
现在您已经分配了足够的内存,您可以将输出写入此数组,而不是
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'
字符表示字符串结束),您的代码将失败。要解决此问题,请传递一个额外的字符串长度参数(您必须在返回的'\0'
数组中自己设置char
字符,并为此指针保留一个额外的内存字节)。它在第一次迭代时也有未定义的行为(正如Cool Guy指出的那样),因为pom
总是至少为1,导致i - pom
,因此试图访问src[-1]
。