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 个区域:
- 个字符在 '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]='[=11=]';
如果您允许 i
足够高以 "jump" 多个区域,则代码可能需要进一步调整。
我必须制作 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 个区域:
- 个字符在 '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]='[=11=]';
如果您允许 i
足够高以 "jump" 多个区域,则代码可能需要进一步调整。