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.
相关产品推荐
相关产品推荐

