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

C语言自定义encodeChar字符编码函数运行结果错误该如何排查?

问题排查与修复

错误根因定位

你写的encodeChar函数存在两个核心逻辑错误:

  • 内层遍历规则数组时,匹配到对应规则后没有终止循环,后续不匹配的规则会执行else分支,把已经替换成功的字符重新覆盖为原字符
  • 无论是否匹配到规则,每遍历一条规则都重复给*t赋值,最终只有最后一条规则的判断结果会生效,前面的匹配逻辑全部被覆盖

以你提供的测试规则为例:

规则1:a→b
规则2:b→c
规则3:c→d

处理字符a的过程:

  1. j=0:匹配规则1 → *t = 'b'
  2. j=1:不匹配规则2 → *t = 'a'
  3. j=2:不匹配规则3 → *t = 'a'
    最终a没有被替换,符合你输出的首字符为a的情况。

处理字符b的过程同理,最后会被不匹配的规则3覆盖回原字符b,只有字符c刚好匹配最后一条规则,所以替换为d,无规则匹配的d保留原值,最终结果就是你得到的abdd。

另外注意你给出的「正确实现参考」存在缩进错误,把s++、t++写在了内层规则遍历循环里,会导致字符遍历跳步、数组越界,属于错误写法,不要参考。

修复后的正确代码

void encodeChar(Rule *table, int size, char *s, char *t) 
{
    int i, j;
    for(i = 0 ; s[i] != '\0'; i++){
        // 先默认保留原字符
        t[i] = s[i];
        for(j = 0; j < size; j++){
            if(s[i] == table[j].source){
                // 匹配到规则就替换,然后终止规则遍历
                t[i] = table[j].code;
                break;
            }
        }
    }
    // 字符串末尾加结束符
    t[i] = '\0';
}

也可以用指针写法,逻辑一致:

void encodeChar(Rule *table, int size, char *s, char *t) 
{
    while(*s != '\0'){
        *t = *s;
        for(int i = 0; i < size; i++){
            if(*s == table[i].source){
                *t = table[i].code;
                break;
            }
        }
        t++;
        s++;
    }
    *t = '\0';
}

额外优化建议

如果规则数组存在多个相同source的规则,默认会匹配第一条生效的规则,符合编码逻辑的通用设计。如果需要后定义的规则覆盖先定义的,可以调整遍历顺序从后往前遍历规则数组即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:54:04