我必须生成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]='\0';
输出应为abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
,目前为abcdefghijklmnopqrstuvwxyzABCDEFGHIJQRSTUVWXYZ[\]^_
。
我尝试了一些条件,但无法找到合适的条件。
答案 0 :(得分:1)
您的测试尚未完成。考虑&#34; ASCII空间&#34;:
\0 ... 'A' ... 'Z' ... 'a' ... 'z' ...
您有5个区域:
您需要的是在移动后处理区域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
足够高以及跳过&#34;代码可能需要进一步调整。不止一个地区。