2015-09-24 28 views
0

嗨我正在這個凱撒密碼解密器,採取加密的字符串和解密他們與所有鍵(然後另一個功能將匹配他們,如果他們是類似於另一個消息)。我有Decipher函數,但我只是想知道是否有其他方法可以編寫函數。任何想法將不勝感激。謝謝!凱撒解密函數替代C++

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

是的,使用字符常量,如'A'而不是數字65. –

回答

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); 
+0

這是一個賦值,我只允許使用(char cip [],char key)參數使用一個解密函數而不是兩個。無論如何,你可以適應,所以我仍然有一個功能? – Aroch925

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

這需要一個字符串作爲參照,然後使用範圍爲基礎的循環遍歷字符串中的字符采用r值引用以便對char進行更改,這會影響原始字符串。

我還沒有對你如何執行旋轉數學做任何改變,因爲它不是如何與它是如何相關的。