gpt4 book ai didi

c - 如何在c中解压缩char数组

转载 作者:行者123 更新时间:2023-12-02 03:30:28 36 4
gpt4 key购买 nike

我需要创建函数:

char * decompress(const char * src) {
}

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

Hello world! -> Hello world!

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

如您所见,是否有某个数字会重复前一个字符此次数。我是 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;
}

最佳答案

既然你提到你是一名 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' 字符指示字符串的结尾),您的代码将失败。为了解决这个问题,传递一个额外的字符串长度参数(您必须自己在返回的 char 数组中设置 '\0' 字符,并保留一个额外的字节该指针的内存)。它在第一次迭代时也有未定义的行为(正如 Cool Guy 所指出的),因为 pom 始终至少为 1,导致 i - pom,因此尝试访问源[-1]

关于c - 如何在c中解压缩char数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27076977/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com