Caesar Decipher功能替代C ++

时间:2015-09-24 00:54:15

标签: c++ caesar-cipher

嗨我正在研究这个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);
  }

 }

}

2 个答案:

答案 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 的方式无关。