嗨我正在研究这个Caesar密码解密器,它使用加密字符串并用所有密钥对它们进行解密(如果它们与另一个消息类似,则另一个函数将匹配它们)。我有Decipher功能,但我只是想知道是否还有其他方法可以编写该功能。任何想法将不胜感激。谢谢!
void Decipher(char cip[], char key){
for(int i = 0; cip[i] != '\0'; i++){
if(cip[i] == ' '){
cip[i]= cip[i];
}else if(int(cip[i] >= int(key){
cip[i] = char(int(cip[i]) - ((int(key) - 65) % 26));
}else{
cip[i] = char(26 + int(cip[i]) - ((int(key)-65) % 26);
}
}
}
答案 0 :(得分:1)
总是另一种方式。通常有六种以上的方式。首先,我将解密的部分单独移动到一个函数中。
char decipher(char in, char key) {
// ..
return in;
}
然后考虑到代码中的共性,我会尝试删除至少一些重复:
char decipher(char in, char key) {
if (in != ' ') {
in = char(in - ((key - 'A') % 26));
if (in < 0)
in += 26;
}
return in;
}
这给我们留下了遍历字符串并解密每个元素的外部例程。我可能会使用标准算法,并引用std::string
作为参数:
void decipher(std::string &s, char key) {
std::transform(s.begin(), s.end(), s.begin(),
[key](char c) { return decipher(c, key); });
}
或者,您可以使用基于范围的for
循环而不是transform
:
for (auto &c : s)
c = decipher(c, key);
答案 1 :(得分:0)
如果你想要正确的C ++(11)那么......
void Decipher(std::string& cip, unsigned char key) {
for (auto&& c : cip) {
if (c == ' ')
continue;
if (((unsigned char)c) >= key)
c = (char)(((int)c) - (((int)key) - 'A') % 26);
else
c = (char)(26 + ((int)c) - ((((int)key) - 'A') % 26));
}
}
这会将一个字符串作为引用,然后使用基于范围的for循环来迭代字符串中的字符,并使用r值引用,以便对char进行更改,从而影响原始字符串。
我没有对你如何执行轮换数学做出任何改变,因为这与 C ++ ish 的方式无关。