凯撒的密码
#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