C中的凯撒密码,大写和小写

Caesar cipher in C, upper and lower case

我必须制作 Caesar 密码解码器 -- 大小写都适用,但我想不出一个简单的解决方案来做到这一点(或者目前甚至无法工作)。

目前我有这个循环来通过给定的移位破译代码i:

char* s1 = "qrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop";
int s1s = strlen(s1);
int i = 16;
char tmp[s1s+1];
for (int j = 0; j < s1s; ++j) {
    char tmp_s = (char) ((int) s1[j]-i);
    if(tmp_s<65){
        tmp_s+=58;
    }
    tmp[j]=tmp_s;
}
tmp[s1s]='[=10=]';

输出应该是abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,目前是abcdefghijklmnopqrstuvwxyzABCDEFGHIJQRSTUVWXYZ[\]^_

我已经尝试了一些条件,但无法找出正确的条件。

您的测试未完成。考虑 "ASCII space":

[=10=] ... 'A' ... 'Z' ... 'a' ... 'z' ...

您有 5 个区域:

  1. 个字符在 'A' 之前。
  2. 'A' 和 'Z' 之间的字符。
  3. 'Z' 和 'a' 之间的字符。
  4. 'a' 和 'z' 之间的字符。
  5. 'z'. 之后的
  6. 个字符

你需要的是处理区域 1 和 3 中的字符一旦移动(因为你只执行减法,区域 5 永远不会到达)。

为了便于阅读,您还应该在条件中使用字符而不是数值。尝试:

char* s1 = "qrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop";
int s1s = strlen(s1);
int i = 16;
char tmp[s1s+1];
for (int j = 0; j < s1s; ++j) {
    char tmp_s = (char) ((int) s1[j]-i);
    if(tmp_s < 'A'){ /* "area 1" */
        tmp_s += 'z'-'A' + 1; /* shift between 'a' and 'z' */
    }
    else if(tmp_s < 'a' && s1[j] >= 'a'){ /* "area 3" */
        tmp_s += 'Z'-'a' + 1; /* shift between 'A' and 'Z' */
    }
    tmp[j]=tmp_s;
}
tmp[s1s]='[=11=]';

如果您允许 i 足够高以 "jump" 多个区域,则代码可能需要进一步调整。