我正在用字母表中的另一个字母替换字母表中的每个字母。
例如,每个“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”实例后调用终止
What(): basic_string::at: __n (即 0) >= this->size() (即 0)
谁能告诉我应该对此代码进行哪些更改?
Your 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);
}
这是一个demo https://godbolt.org/z/khvP8n.
或者,您可以确保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));
这是一个demo https://godbolt.org/z/fK5Y7q.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)