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

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

关键修正点说明

  1. 修复首字符重复计数:把初始化时的count +=1改成count =1,并将两个if合并成if-else结构,避免对同一个字符重复计数。
  2. 添加最后一组字符处理:在while循环结束后,判断是否还有未输出的统计结果,确保所有连续字符都能被写入输出文件。
  3. 健壮性优化:将c的类型改为ssize_t,并在每次read后检查是否出错,避免读取错误时进入异常逻辑。
  4. 移除冗余操作:删掉了不必要的buffer[c] = '\0';,因为我们是逐个处理buffer中的字符,不需要将其视为字符串。

经过这些修改后,输入AABBBcccc就能正确输出2A3B4c了,同时函数也能正确返回写入的总字符数。

内容的提问来源于stack exchange,提问作者revcat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:19:10