使用替换密码进行加密



我将用字母表中的另一个字母替换字母表的每个字母。例如,每个"a"都被替换为"Q",每个"b"都被取代为"W"。我已经写了代码来加密下面的句子。

#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main(){
string alphabet {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
string key      {"QWERTYUIOPasdfghjklZXCVBNMqwertyuiopASDFGHJKLzxcvbnm"};
string original {};
string encrypted {};
cout<<"Enter your secret message: ";
getline(cin ,original);
// cout<<"Encrypting message..."<<endl;
for(int i=0;i<original.length();i++){
if(isalpha(original.at(i)) == 1){
encrypted.at(i) =  key.at(alphabet.find(original.at(i)));
}
else
encrypted.at(i) = original.at(i);
}
cout<<"Encrypted message: "<<encrypted<<endl;
}

我正在将字符串字母表中索引为I的每个字符更改为键中相同索引的字符。例如:-If Original字符串="Hello"加密字符串应为"iTssg">

但是当我运行这个程序时,我得到了一个错误

输出:输入你的秘密信息:你好在抛出"std::out_of_range"的实例后调用terminatewhat((:basic_string::at:__n(为0(>=this->size(((为0

有人能告诉我应该对此代码进行哪些更改吗?

您的encrypted字符串为空,因此使用.at()对其进行索引会引发异常。

为了解决这个问题,您可以附加字符,如下所示:

for(int i=0;i<original.length();i++){
if(std::isalpha(original.at(i))){
encrypted +=  key.at(alphabet.find(original.at(i)));
}
else 
encrypted += original.at(i);
}

这是一个演示。

或者,您可以确保encrypted的大小与original的大小相同,如下所示:

encrypted = original;

然后你的循环保持不变。

此外,您可以通过使用循环的范围来简化循环:

for(unsigned char c : original){
if(std::isalpha(c)){
encrypted +=  key.at(alphabet.find(c));
}
else
encrypted += c;
}

您可以通过结合以下两种方法来进一步简化这一过程:

string encrypted = original;
for (auto &c : encrypted)
if (std::isalpha(c))
c = key.at(alphabet.find(c));

这是一个演示。

最新更新