2017-05-31 84 views
-4

我需要建立一個函數,根據一個關鍵字來移動一個字符串。例如,如果短語是「AAAAAA」並且關鍵是「CDE」,那麼輸出應該是「DEFDEF」。到目前爲止,我已經拿出C++代碼加密檢查

string encrypt(string phrase, string key){ 
    string final; 
    for(int j = 0; j <= key.length()-1; j++){ 
     for(int i=j; i <= phrase.length()-1; i += key.length()){ 
      int int_phr = phrase[i]; 
      int int_key = key[j]; 
      char temp = int_phr+int_key-96; 
      final += temp; 
    } 
} 
return final; 

但我不斷收到一個錯誤,加入「A」和「C」得到「D」。

有什麼建議嗎?

+0

這稱爲VIgenere密碼。谷歌它,你會發現很多代碼的例子。 – Barmar

+1

你會得到什麼「錯誤」? –

回答

2

的問題是96在減法:

char temp = int_phr + int_key - 96; 

這將是正確的,如果int_key是一個小寫字母,因爲它們的ASCII值開始在97。但大寫字母從65開始,因此您需要減去96

const char lower_base = 'a' - 1; 
const char upper_base = 'A' - 1; 
char temp = int_phr + int_key - (islower(int_key) ? lower_base : upper_base); 

請注意,我已經刪除了硬編碼的數字和使用的字符自行確定基礎:您可以處理這兩種情況。

當您到達字母表末尾時,您還需要考慮環繞。您可以使用模運算符來執行此操作:

char phr_base = islower(int_phr) ? lower_base : upper_base; 
char phr_offset = int_phr - phr_base; 
char adjust = int_key - (islower(int_key) ? lower_base : upper_base); 
char temp = phr_base + (phr_offset + adjust) % 26; 
final += temp;