我必须生产凯撒密码译码器-无论大小写,但我无法想到一个简单的解决方案来做到这一点(或目前甚至工作的一个)。
目前,我有这个循环来通过给定的移位来破译代码:

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]='\0';

输出应该是i,此时它是abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
我试过一些条件,但不能真正找出正确的条件。

最佳答案

你的测试没有完成。考虑一下“ascii空间”:

\0 ... 'A' ... 'Z' ... 'a' ... 'z' ...

这里有5个区域:
“a”之前的字符。
“a”和“z”之间的字符。
“z”和“a”之间的字符。
“a”和“z”之间的字符。
“z”后的字符。
你需要的是处理区域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]='\0';

如果您允许i的高度足以“跳跃”多个区域,则代码可能需要进一步调整。

关于c - C中的凯撒密码,大写和小写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40718141/

10-11 21:22