C语言自定义encodeChar字符编码函数运行结果错误该如何排查?
问题排查与修复
错误根因定位
你写的encodeChar函数存在两个核心逻辑错误:
- 内层遍历规则数组时,匹配到对应规则后没有终止循环,后续不匹配的规则会执行
else分支,把已经替换成功的字符重新覆盖为原字符 - 无论是否匹配到规则,每遍历一条规则都重复给
*t赋值,最终只有最后一条规则的判断结果会生效,前面的匹配逻辑全部被覆盖
以你提供的测试规则为例:
规则1:a→b
规则2:b→c
规则3:c→d
处理字符a的过程:
- j=0:匹配规则1 → *t = 'b'
- j=1:不匹配规则2 → *t = 'a'
- 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
相关产品推荐
相关产品推荐

