C语言连续字符计数编码函数问题:首字符计数多1的修复求助
解决连续字符编码首字符计数多1的问题
看起来你已经接近完成这个连续字符统计编码的功能了,首字符计数多1的问题其实是因为对第一个字符进行了两次计数,咱们一步步理清楚问题和修复方案:
问题根源分析
看你encode_aux函数里的这段核心逻辑:
if (count == 0) { previous = buffer[i]; count += 1; } if (count != 0) { if (previous == buffer[i]) { count += 1; } // ... 其他输出逻辑 }
当处理第一个字符时,第一个if块已经把count设为1了,紧接着的第二个if块又因为字符相等,把count再加1变成2——这就直接导致首字符的初始计数多了1,后续连续相同字符还会继续累加,最终输出的首字符数量就比实际多了1。
另外还有个隐藏问题:当前代码在所有字符读取完成后,最后一组连续字符不会被输出,因为只有遇到不同字符时才会输出之前的统计结果。比如输入AABBBcccc,最后一组的cccc就会被漏掉。
完整修复方案
我把修正后的encode_aux函数写出来,同时解决这两个问题:
int encode_aux(int fd1, char *buffer, FILE *outt) { // 用ssize_t接收read的返回值,处理出错情况 ssize_t c = read(fd1, buffer, sizeof(buffer) - 1); char previous; int count = 0; int total = 0; // 只有读取到有效字节才进入循环,出错或EOF则退出 while (c > 0) { for (size_t i = 0; i < (size_t)c; i++) { if (count == 0) { // 初始化第一个字符的计数,直接设为1 previous = buffer[i]; count = 1; } else if (previous == buffer[i]) { // 字符相同,计数累加 count++; } else { // 字符不同,输出之前的统计结果 if (count != 1) { total += fprintf(outt, "%d", count); } total += fprintf(outt, "%c", previous); // 重置当前字符的计数 previous = buffer[i]; count = 1; } } // 再次读取下一批数据,同时检查读取错误 c = read(fd1, buffer, sizeof(buffer) - 1); if (c == -1) { perror("Failed to read input file"); return -1; } } // 处理最后一组未输出的连续字符 if (count > 0) { if (count != 1) { total += fprintf(outt, "%d", count); } total += fprintf(outt, "%c", previous); } return total; }
关键修正点说明
- 修复首字符重复计数:把初始化时的
count +=1改成count =1,并将两个if合并成if-else结构,避免对同一个字符重复计数。 - 添加最后一组字符处理:在
while循环结束后,判断是否还有未输出的统计结果,确保所有连续字符都能被写入输出文件。 - 健壮性优化:将
c的类型改为ssize_t,并在每次read后检查是否出错,避免读取错误时进入异常逻辑。 - 移除冗余操作:删掉了不必要的
buffer[c] = '\0';,因为我们是逐个处理buffer中的字符,不需要将其视为字符串。
经过这些修改后,输入AABBBcccc就能正确输出2A3B4c了,同时函数也能正确返回写入的总字符数。
内容的提问来源于stack exchange,提问作者revcat
相关产品推荐
相关产品推荐

