2016-09-25 89 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

非常感谢! –