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

ROT13编码代码中break语句的作用及缺失致编码错误的原因

ROT13编码程序不加break导致错误的原因

问题场景

我写了一个ROT13编码程序,发现当if语句里不添加break;时,编码结果会出现部分错误,相关代码如下:

#include <stdio.h>

int main() {
    char s1[] = "ROT13 (\"rotate by 13 places\", sometimes hyphenated ROT-13) is a simple letter substitution cipher.\n";
    char s2[] = "ROT13 (\"rotate by 13 places\", sometimes hyphenated ROT-13) is a simple letter substitution cipher.\n";
    char codec[] = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ";
    char ROT13[] = "nNoOpPqQrRsStTuUvVwWxXyYzZaAbBcCdDeEfFgGhHiIjJkKlLmM";
    int i =0;
    int j =0;

    printf("%s\n",s1);  //prints source string
    
    for (i = 0; s1[i] !='\0'; i++) {
        for (j = 0; codec[j] != '\0'; j++) {
            if (s1[i] == codec[j]) {
                s1[i] = ROT13[j];
                break;
            }
        }
    }
    printf("%s\n", s1);   //Output after ROT13 encoding
    
    for (i = 0; s2[i] !='\0'; i++) {
        for (j = 0; codec[j] != '\0'; j++) {
            if (s2[i] == codec[j]) {
                s2[i] = ROT13[j];
                //break;
            }
        }
    }
    printf("%s", s2);   //Output after ROT13 encoding

    return 0;
}

编译结果显示:第一个加break;的输出是正确的ROT13编码,第二个去掉break;的输出存在大量错误。

错误原因

核心问题是字符被重复替换:

  1. ROT13的逻辑是每个字母只需要替换一次——26个英文字母,往后移13位是编码,再移13位就会回到原字母
  2. 你的codec数组按aAbBcC...zZ顺序排列,对应的ROT13数组是每个字符的13位替换值
  3. 当找到匹配字符并替换后,如果不执行break;,内层j循环会继续遍历codec数组:
    • 比如原字符是'R',替换后变成'E',但codec数组后面还有'E'这个字符,此时已经变成'E'的s2[i]会再次匹配,被替换回'R'
    • 部分字符甚至会被多次匹配替换,最终变成完全不符合预期的结果
  4. 加了break;的循环在替换后立刻终止内层循环,每个字符只被替换一次,完全符合ROT13的编码逻辑,所以结果正确

内容的提问来源于stack exchange,提问作者Akintola Oluwaseyi Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:52