如何在C语言中实现RLE?我的代码输出为空,求技术帮助
问题排查与修正
你的代码存在多个关键问题,导致输出异常,下面逐一说明并给出修复后的版本:
核心错误点
- 返回值类型错误:函数声明为
char rle(char src[]),但实际需要返回字符串(字符指针),应该改为char* rle(const char src[])(加const表示输入字符串只读)。 - 结果字符串初始化错误:
char res = "";把字符串常量赋值给单个字符变量,完全错误。需要使用动态分配的内存或者足够大的缓冲区来存储结果,这里推荐用动态分配,避免缓冲区溢出。 - 循环变量未初始化:
for (int i; i < len; i++)中的i没有初始值,会导致随机起始位置,应该改为for (int i = 0; i < len; )(注意去掉i++,因为内层while已经在递增i)。 - 越界访问问题:内层
while循环中i++会导致i超过字符串长度,访问src[i]时越界,需要在循环条件里加上i < len。 - 字符串拼接逻辑错误:
res+=src[tmp] + snprintf(NULL,0,"%d",count);这种写法完全不符合C语言字符串操作逻辑,snprintf返回的是格式化后的字符数,不是字符串,而且不能直接用+=拼接字符和数字。需要用snprintf把字符和计数格式化到结果缓冲区里。 - 未处理最后一组字符:原循环结束后没有把最后一组的字符和计数加入结果。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> char* rle(const char src[]) { // 处理空输入 if (src == NULL || src[0] == '\0') { char* empty = malloc(1); if (empty) empty[0] = '\0'; return empty; } int len = strlen(src); // 预估结果缓冲区大小:最坏情况每个字符都是单独的,比如"abcde"会变成"a1b1c1d1e1",长度是2*len+1 char* res = malloc(2 * len + 1); if (!res) return NULL; // 内存分配失败返回NULL char current = src[0]; int count = 1; int res_idx = 0; for (int i = 1; i < len; i++) { if (src[i] == current) { count++; } else { // 把当前字符和计数写入结果 res_idx += snprintf(res + res_idx, 2 * len + 1 - res_idx, "%c%d", current, count); current = src[i]; count = 1; } } // 处理最后一组字符 res_idx += snprintf(res + res_idx, 2 * len + 1 - res_idx, "%c%d", current, count); res[res_idx] = '\0'; // 确保字符串以'\0'结尾 return res; } int main(int argc, char *argv[]) { char* result = rle("aaaaa"); printf("%s\n", result); free(result); // 记得释放动态分配的内存,避免内存泄漏 return 0; }
说明
- 用
malloc动态分配结果缓冲区,预估足够大的空间,避免溢出。 - 遍历字符串时,统计连续相同字符的数量,遇到不同字符就把当前统计结果写入缓冲区。
- 最后处理循环结束后剩下的最后一组字符。
- 加入了空输入的处理,以及内存分配失败的判断。
- 主函数中使用完结果后记得
free,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Behrad Sharifi
相关产品推荐
相关产品推荐

