我将用字母表中的另一个字母替换字母表的每个字母。例如,每个"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));
这是一个演示。