我要用另一个字母替换每个字母。 例如,每个“ 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;
}
我正在用键中具有相同索引的char更改字符串字母中具有索引i的每个char。 例如:-如果原始字符串=“ Hello” 加密的字符串应为“ iTssg”
但是当我运行该程序时,我得到了一个错误
输出: 输入您的秘密信息:您好 抛出'std :: out_of_range'实例后调用终止 what():basic_string :: at:__n(0)> = this-> size()(0)
有人可以告诉我对此代码进行哪些更改吗?
答案 0 :(得分:4)
您的IndexError: invalid index to scalar variable.
字符串为空,因此用encrypted
对其进行索引会引发异常。
要解决此问题,您可以添加字符,如下所示:
.at()
这里是demo。
或者,您可以确保 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
然后您的循环保持不变。
此外,您可以使用range-for循环来简化循环:
encrypted = original;
您可以通过组合两种方法来进一步简化此操作:
for(unsigned char c : original){
if(std::isalpha(c)){
encrypted += key.at(alphabet.find(c));
}
else
encrypted += c;
}
这里是demo。