我有一个用ROT13编码给定字符串的程序。但是,我意识到如果我不在if statement
中的某个地方添加一个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;
}
编译后的结果。
2条答案
按热度按时间eoigrqb61#
break;
使它退出循环。例如,当明文是
c
时,它被加密为p
,如果没有break;
,则继续扫描,找到p
,并再次将其加密为c
。break;
是为了防止这种双重加密。ffscu2ro2#
在第二个字符匹配循环中需要
break
,原因与在第一个字符匹配循环中需要break
相同。如果在codec
中找到与输入字符串中的当前字符匹配的字符,则替换在输入字符串中找到的字符。s1
或s2
。然后,您需要在替换字符后立即退出字符匹配循环,以前进到输入字符串中的下一个字符。如果在替换输入字符串中的当前字符后没有前进到输入字符串中的下一个字符,则可以匹配替换字符并进行第二次旋转。是否进行第二次旋转取决于要匹配的字符。
示例:如果输入字符串中的字符是
'A'
,然后替换为'N'
,并且您继续查找匹配项,您将找到'N'
,然后替换已经替换为'N'
的原始字符'A'
,第二次使用'A'
。这种双重替换将输入字符旋转13,然后再次旋转13,进行两次旋转。对于第13个字符之后的字符(
'M'
或'm'
),您会很幸运,因为这些字符会旋转到字母表第一部分的字符,因此这些字符不会经历双重替换。您也可以考虑使用
strchr()
标准C库函数替换执行字符匹配操作的最内层循环的替代实现。