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;的输出存在大量错误。
错误原因
核心问题是字符被重复替换:
- ROT13的逻辑是每个字母只需要替换一次——26个英文字母,往后移13位是编码,再移13位就会回到原字母
- 你的
codec数组按aAbBcC...zZ顺序排列,对应的ROT13数组是每个字符的13位替换值 - 当找到匹配字符并替换后,如果不执行
break;,内层j循环会继续遍历codec数组:- 比如原字符是
'R',替换后变成'E',但codec数组后面还有'E'这个字符,此时已经变成'E'的s2[i]会再次匹配,被替换回'R' - 部分字符甚至会被多次匹配替换,最终变成完全不符合预期的结果
- 比如原字符是
- 加了
break;的循环在替换后立刻终止内层循环,每个字符只被替换一次,完全符合ROT13的编码逻辑,所以结果正确
内容的提问来源于stack exchange,提问作者Akintola Oluwaseyi Alex
相关产品推荐
相关产品推荐

