凯撒的密码

#include  void caesar (char cipher[], int shift); int main () { char cipher[50]; int shift; printf("Enter text to be encrypted IN CAPITAL LETTERS ONLY: "); scanf("%s", cipher); printf("How many shifts do you prefer? 1-10 only: "); scanf("%d", &shift); caesar (cipher, shift); return 0; } void caesar (char cipher[], int shift) { int i = 0; while (cipher[i] != '\0') { if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) { cipher[i] += (shift); } else { cipher[i] += (shift - 25); } i++; } printf("%s", cipher); } 

我开始得到加密输出,但我担心我的陈述有问题。

例如:

  • 输入:ABCD,1class
  • 输出:DEFG <=实际上是3班。

更改

 if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) ... 

 if ((cipher[i] + shift) >= 65 && (cipher[i] + shift) <= 90) ... 

因为+=修改了cipher[i]

(我是通过http://codereview.stackexchange.com来到这里的,所以我还戴着代码审查帽)。

使用操作字母的代码,如果它使用源中的实际字母而不是数字代码,我会发现它更容易理解。 所以我建议改变

  cipher[i] += (shift - 25); 

喜欢的东西

  cipher[i] += (shift - ('Z' - 'A')); 

大多数做Caesar密码的人转换字母,并通过标点符号,数字,空格等不变。 您可以考虑包括标准字符库

 #include  

并使用函数isalpha(),islower(),isupper() – 特别是更改

 if ((cipher[i]) >= 'A' && (cipher[i]) <= 'Z') { 

喜欢的东西

 if (isupper(cipher[i])) { 

 void caesar (char cipher[], int shift) { int i = 0; while (cipher[i] != '\0') { if (cipher[i] >= 'A' && cipher[i]<='Z') { char newletter = cipher[i] - 'A'; newletter += shift; newletter = newletter % 26; cipher[i] = newletter + 'A'; } i++; } printf("%s", cipher); } 

这将忽略任何不是大写字母的内容。

如果字母的代码为0-25,那么转换就很容易,因为我们可以使用剩下的26来保存条件。这就是我所做的,我减去'A',这样A字母将是0,然后我添加移位并计算余数,这样如果你在'Z'中加1,你将再次得到'A',依此类推。 最后我不得不再次添加'A',因为在ASCII中,'A'实际上不是0。

尝试更换

 if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) { cipher[i] += (shift); } else { cipher[i] += (shift - 25); } 

 if ((cipher[i] += shift) >= 65 && (cipher[i] = shift) <= 90) { // do nothing } else { cipher[i] = 'A' + ('Z' - cipher[i]) -1; } 

使用“+ =”将在评估时修改值。 在您的代码中对此进行了3次评估,这就是为什么它提供3个class次!

小工作版本,除负值外没有换档范围:

 #include  void caesar (char cipher[], int shift); int main () { char cipher[50]; int shift; printf("Plaintext (Caps only): "); scanf("%s", cipher); printf("Shift: "); scanf("%d", &shift); caesar (cipher, shift); return 0; } void caesar (char cipher[], int shift) { for(int i=0; cipher[i] != '\0'; i++) cipher[i] = 65 + (cipher[i]-65+shift)%26; printf("Cipher text: %s\n", cipher); } 

我修改了LtWorf以匹配我当前的项目。

换档范围:-9~ + 9

 void caesar(char cipher[], int shift) { int i = 0; while (cipher[i] != '\0') { if (cipher[i] >= 'A' && cipher[i]<='Z') { char newletter = cipher[i] - 'A' + 26; newletter += shift; newletter = newletter % 26; cipher[i] = newletter + 'A'; } else if (cipher[i] >= '0' && cipher[i]<='9') { char newletter = cipher[i] - '0' + 10; newletter += shift; newletter = newletter % 10; cipher[i] = newletter + '0'; } i++; } printf("%s\n", cipher); } 

用于C ++的Caesar密码

 #include #include using namespace std; char cipher(char c, int k) { if(isupper(c)) return char( 'A' + (c - 'A' + k ) % 26); else if(islower(c)) return char( 'a' + (c - 'a' + k ) % 26); else return c; } int main() { int k; string str; cin>>str>>k; int l = str.size(); for(int i=0; i