2016-09-25 90 views
0

我在C++中爲Vigenere Cipher編寫了此代碼(假定明文和密鑰是小寫的)。C++ Vigenere Cipher

void encrypt(string& plaintext , string key){ 
int j = 0; 

    for(int i=0; i<plaintext.length(); i++){ 

    //cout<<"value of key["<<j<<"] = "<<int(key[j])<<endl; 

    plaintext[i] -= 97; 
    key[j] -= 97; 

    plaintext[i] = ((plaintext[i] + key[j])%26)+97; 

    j = (j+1)%key.length(); 
    } 
} 

問題是,當'j'被重置爲0時,鍵[j]結果爲NULL(0)。 例如。如果我假設明文爲'人類'密鑰爲'abcd'明文的前4個字符被正確加密,但對於最後一個字符,密鑰[j]值將變爲0或零而不是回到'一個'。

我不知道爲什麼會發生這種情況。我猜字符串類隱式地處理空值,這使我更加困惑。

+0

檢查'key.length()'。對於「abcd」鍵,它顯然應該是4,但是根據你的描述,它必須是5.無論代碼設置了key的值,它都做得不正確,這就是錯誤所在,而不是這裏。 –

+0

@SamVarshavchik我試圖打印它,它顯示4 –

回答

1
key[j] -= 97; 

第一次通過密鑰時,這段代碼會遍佈它。

如果key爲「ABCD」,在第二遍將現在爲0

不要在你的函數修改key。由於該參數不應更改,因此應聲明爲const std::string key,或更好的是const std::string &key。如果這樣做了,編譯器會爲你抓到這個bug。

+0

非常感謝! –