0

嗨,我正在研究这个凯撒密码解密器,它采用加密字符串并用所有密钥解密它们(如果它们与另一条消息相似,另一个函数将匹配它们)。我有 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);
  }

 }

}
4

2 回答 2

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;
}

这给我们留下了逐步遍历字符串并破译每个元素的外部例程。我可能会为此使用标准算法并引用 anstd::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);
于 2015-09-24T01:11:34.520 回答
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 值引用,以便对字符的更改影响原始字符串。

我没有对您执行旋转数学的方式进行任何更改,因为这与它的C++ 风格无关。

于 2015-09-24T01:17:18.717 回答