You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言连续字符压缩函数实现遇阻,请求技术支持

嘿,我刚好折腾过类似的字符压缩需求,给你梳理下核心逻辑,再贴个可直接运行的示例代码,应该能解决你的问题~

连续字符压缩函数的实现思路与代码

首先咱们明确核心逻辑:遍历输入字符串时,跟踪当前字符的连续出现次数,当遇到不同字符时,就把当前字符(如果次数大于1就追加计数)写入结果数组,然后更新当前字符和计数。最后别忘了处理循环结束后剩下的最后一组字符,这是很多人容易漏掉的点。

下面是完整的C语言实现,注释已经写得很清楚了:

#include <stdio.h>
#include <string.h>

// 压缩连续重复字符的函数
void compressString(const char* input, char* output) {
    // 先处理空指针这种边界情况,避免程序崩溃
    if (input == NULL || output == NULL) {
        return;
    }

    int inputLen = strlen(input);
    // 输入字符串为空的话,直接返回空字符串
    if (inputLen == 0) {
        output[0] = '\0';
        return;
    }

    char currentChar = input[0]; // 记录当前正在统计的字符
    int count = 1;               // 记录当前字符的连续出现次数
    int outputIndex = 0;         // 结果数组的写入指针

    // 从第二个字符开始遍历输入字符串
    for (int i = 1; i < inputLen; i++) {
        if (input[i] == currentChar) {
            // 字符相同,计数加1
            count++;
        } else {
            // 遇到不同字符,先把当前字符写入结果
            output[outputIndex++] = currentChar;
            // 如果计数大于1,把数字转成字符追加进去
            if (count > 1) {
                // 这里默认计数不超过9,如果要支持多位数,看后面的扩展方案
                output[outputIndex++] = '0' + count;
            }
            // 更新当前字符和计数,开始统计新的字符
            currentChar = input[i];
            count = 1;
        }
    }

    // 处理最后一组连续字符(循环结束后剩下的那组)
    output[outputIndex++] = currentChar;
    if (count > 1) {
        output[outputIndex++] = '0' + count;
    }
    // 一定要加上字符串结束符,否则会出现乱码
    output[outputIndex] = '\0';
}

// 测试用例
int main() {
    char input[] = "blaablaaa";
    char output[100]; // 要确保输出数组的大小足够容纳压缩后的结果

    compressString(input, output);
    printf("原字符串: %s\n", input);
    printf("压缩后字符串: %s\n", output); // 预期输出:bla2bla3

    return 0;
}

几个关键注意点

  • 边界情况处理:空指针、空输入字符串都要提前判断,不然很容易触发内存错误。
  • 最后一组字符的处理:循环里只有遇到不同字符才会写入结果,最后一组字符没触发这个逻辑,所以循环结束后必须单独处理。
  • 多位数计数扩展:上面的代码只支持1-9的计数,如果要处理比如"aaaaaaaaaa"(10次)转成"a10",可以把写入计数的部分改成下面这样,用sprintf把数字转成字符串:
if (count > 1) {
    char numBuffer[10]; // 足够容纳大部分整数的字符串形式
    sprintf(numBuffer, "%d", count);
    // 把数字字符串复制到结果数组里
    strcpy(output + outputIndex, numBuffer);
    // 更新结果数组的写入指针位置
    outputIndex += strlen(numBuffer);
}

这样修改后,不管计数是多少,都能正确转成字符串追加到结果里了。

内容的提问来源于stack exchange,提问作者George P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:19:47