我将每个字母替换为另一个字母,例如,每个'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的每一个字符都改成与密钥相同索引的字符,例如:- 如果原始字符串="Hello",加密后的字符串应该是 "iTssg"
但当我运行这个程序时,我得到一个错误信息
输出:输入你的秘密信息。在抛出一个'std::out_of_range'实例后调用了Helloterminate what(): 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;
然后你的循环就会保持不变
另外,你也可以简化你的循环,使用一个range-for循环。
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));
这里有一个 演示.