如何解压缩C中的字符数组

2024-04-15

我需要创建函数:

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];

并返回指针。


请注意,您should使用完返回值后释放它,即使它位于 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].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解压缩C中的字符数组 的相关文章

随机推荐

  • PHP 相当于 JavaScript 的 substring()

    JavaScript 有两个方便的子字符串函数 substring from to and substr start length 这意味着我可以决定 当我从位置 X 开始获取子字符串时 我是否要指定结束的字符串位置或子字符串的长度 一个很
  • Android:无需可怕的(用户)权限即可获取用户ID?

    为了管理用户偏好 目前我正在获取谷歌用户名 实际上是他们在设备上注册的电子邮件地址 并使用它 的散列 作为 用户ID 来区分不同的用户 与所描述的内容相符的东西here https stackoverflow com a 4039018 4
  • 通过蓝牙检测附近的另一台 Android 设备

    好吧 我这里有一个有点奇怪的问题 我正在开发一款 Android 游戏 我希望 Android 手机能够检测到彼此的存在 搜索其他玩家的设备将知道其他玩家设备的蓝牙 MAC 地址 来自游戏数据库 但是设备不会配对 并且设备不会处于可发现模式
  • linux:禁用使用环回并通过一个组件的 2 个 eth 卡之间的线路发送数据[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个带有 2 个 eth 卡的计算机 通过跳线连接 从第一个到第二个的直接以太网电缆 Linux已安装 我想从第一个网卡向第二个网卡发送数据 我想
  • 是否可以替换 64 位编码图像中的颜色?

    有没有办法获取 64 进制字符串 例如 copyIcon background url data image png base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8 9hAAAAW0lEQV
  • Windows 8 桌面上的 Chrome 浏览器:触摸支持错误

    Windows 8 桌面上的 Chrome 浏览器 版本 23 0 1271 97 被错误地识别为支持触摸事件 实际上它是一个桌面 也就是说 它不支持触摸事件 请参阅 Modernizr Touch 测试示例 http modernizr
  • IE8 中使用 Fancybox 的 jQuery 问题

    我最近收购了一个旧网站 我们谈论的是表格 图像地图 凡是你能想到的 我被要求将 Flash 画廊的旧链接放入灯箱中 我只是用了一个javascript openLightbox 在画廊链接 右上角 上 我知道我知道 但是这看起来并不不合时宜
  • tcp_max_syn_backlog 和 somaxconn 有什么区别?

    我一直在阅读一些关于 Linux 上的 TCP 实现的文章 我很困惑 它们之间有什么区别net ipv4 tcp max syn backlog and net core somaxconn和backlog作为参数传递给listen 系统调
  • 在Excel中通过VBA调用COM加载项

    我有一个用 VSTO 编写的 COM 加载项 我想使用 VBA 宏来调用它 对于加载项 我需要启动它 输入一些文本 自动 然后运行应用程序 该加载项都是按钮 我无法轻松访问代码 因为其中一些代码是加密的 它是第三方 遗憾的是 当单击此加载项
  • 如何隐藏我的源代码以免被复制

    最近有人通知我 我的网站被复制了 当我查看他给我的链接时 我发现除了徽标和文本之外 该网站与我的网站相同 有没有办法隐藏我的代码 或者使我的页面无法右键单击 我在一些网站上看到 如果您访问http example com images ht
  • unique_ptr 的初始化有什么问题?

    有人可以告诉我 以下 unique ptr 初始化有什么问题吗 int main unique ptr
  • 如何动态更改文本字段中特定文本的颜色?

    Consider bellow image I want to dynamically change the text color of part of the text based on the user input text not t
  • Eclipse中的部署目录在哪里?

    我正在 Eclipse 中开发一个 Web 应用程序 部署目录树位于哪里 在我的 Java 工作区树中的 Apache 目录结构或某些子目录树结构中 我问这个问题是因为当我的教程应用程序的更新不起作用时 我去浏览目录树 并且假设src子树代
  • WPF:将 DataGrid 绑定到列表

    有趣的是 有时简单的事情会在背后咬我一口 我可以使用 DataGridTextColumn 将 DataGrid 很好地绑定到某个任意类的集合 如下所示 bound to List
  • 使用 web-fragment 时 tagdir 属性无效

    我正在使用 web fragment 功能在 jar 中维护 JSP 和标签 并且使用这种方法 我的 JSP 页面无法找到 tagdir 并导致 此标签库的 tagdir 属性值无效 这是我的罐子里的结构 META INF 资源 WEB I
  • 在 Java 中将颜色名称转换为 RGB 值

    当颜色名称作为输入给出时 我想要一个 RGB 值 以下代码适用于某些颜色 我猜适用于红色等原色 但适用于其他一些颜色 例如青色和淡紫色 import java awt Color import javax swing text html S
  • 如何找到最新的 gradle 版本和包装器

    嗨 我对 Android 开发相当陌生 我对 Gradle 版本和 gradle wrapper properties 中的分发 url 有疑问 classpath com android tools build gradle gradle
  • 如何使用 iOS Swift 更新 firebase 中的单个数组元素?

    这里我使用 firestore 查询来更新 插入数据 如何将数组值的字典更新到 firebase 数据库 here is my firestore data structure 现在可以获取数据slot1 gt 第 0 个位置值在模型类中
  • 谷歌图表显示的是金钱而不是百分比

    给定饼图的数据 data new google visualization arrayToDataTable Sales Revenue Distribution Author 5 Company 2 Tax 0 4 Payment Pro
  • 如何解压缩C中的字符数组

    我需要创建函数 char decompress const char src 该函数的输入是一些字符串 Hello world gt Hello world Hel2o world 10 gt Hello world 正如您所看到的 如果有