我正在用C ++构建Vignere密码,由于某种原因,在第一个crypto / decrypt命令之后,引入了一个额外的符号,而我对为什么感到困惑。 这是一个例子
aaaa,bbbb,1
作为输出,我们得到
bbbb
此后,我们重复操作
aaaa,bbbb,1
现在,我们得到了:
?bbbb
解密也会发生同样的事情。考虑到最初的加密/解密工作正常,我对为什么要添加它感到很困惑
这是vignere.cpp
#include <iostream>
#include <cstdlib>
#include<algorithm>
std::string encrypt(std::string plaintext, std::string key, int encryptordecrypt){
std::string ciphertext="";
std::string dekey="";
if(key[0]==' '){
key.erase(std::remove(key.begin(),key.end(),' '),key.end()); }
unsigned int keylength=key.length(); /* Gets rid of leading spaces */
for( unsigned int i=0; i<plaintext.length();i++){
if(islower(plaintext[i])){
plaintext[i]=toupper(plaintext[i]);
};
if(islower(key[i%keylength])){
key[i]=toupper(key[i%keylength]);
};
if(encryptordecrypt>0){
if(plaintext[i]==' '){
ciphertext+=' ';
}
else{
div_t ptxtdiv= div(plaintext[i]+key[i%keylength]-65*2,26);
int rem= ptxtdiv.rem;
ciphertext+= char (rem+65);
};
}
else if(encryptordecrypt<0){
if(plaintext[i]==' '){
ciphertext+=' ';
}
else{
dekey+=26-key[i]+65*2;
std::cout<< dekey[i]<<std::endl;
div_t ptxtdiv= div(plaintext[i]+dekey[i%keylength]-65*2,26);
int rem= ptxtdiv.rem;
ciphertext+= char (rem+65);
};
}
};
return ciphertext;
}
这是main.cpp
#include <iostream>
#include <cstdlib>
std::string encrypt(std::string plaintext, std::string key,int encryptordecrypt);
int main(){
std::cout << "Please input the message, then the key, separated by a comma, and then after another comma, either 1=encrypt or -1=decrypt" << std::endl;
std::string plaintext,key;
int enorde;
while(std::getline(std::cin,plaintext, ',') && std::getline(std::cin,key,',') && std::cin>>enorde){
std::cout << encrypt(plaintext,key,enorde) << std::endl;
}
return 0;
}
可能是因为
std :: string Ciphertext =“”;
不在循环中吗?
答案 0 :(得分:3)
它没有被添加-输入内容超出了您的想象。
如果您立即打印所读内容:
while(std::getline(std::cin,plaintext, ',') && std::getline(std::cin,key,',') && std::cin>>enorde){
std::cout << "Plaintext: " << plaintext << std::endl
<< "key: " << key << std::endl
<< "direction: " << enorde << std::endl;
std::cout << encrypt(plaintext,key,enorde) << std::endl;
}
您将会看到
Plaintext: aaaa
key: bbbb
direction: 1
BBBB
Plaintext:
aaaa
key: bbbb
direction: 1
?BBBB
请注意,第二个plaintext
中有一个换行符。
这是因为std::cin>>enorde
将换行符留在了输入缓冲区中,当您在下一次迭代中读取下一个逗号时,它将被拾取。
简单的解决方法是在循环中添加std::cin.ignore(some_big_number, '\n')
。
道德:当输出令人惊讶时,请验证输入是否符合您的预期。