所以我正在开发一个简单的程序,它使用 Caesar Cipher 转换普通字符串,它只是将字符串的字母向前移动 3 次,然后解密它,只需撤消它(非常基本的东西),就像我的一个简单测试对 c++ 的理解(我是初学者)并且我收到的错误不是在我的 IDE(代码::块)中,而是在控制台中:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 1) >= this->size() (which is 0)
这是我的代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string input;
string conversion;
cin >> input;
for(unsigned int i = 1; i<input.length(); i++){
if(input.at(i) == 'a' || input.at(i) == 'A'){
conversion.at(i) = 'D';
}
if(input.at(i) == 'b' || input.at(i) == 'B'){
conversion.at(i) = 'E';
}
if(input.at(i) == 'c' || input.at(i) == 'C'){
conversion.at(i) = 'F';
}
if(input.at(i) == 'd' || input.at(i) == 'D'){
conversion.at(i) = 'G';
}
if(input.at(i) == 'e' || input.at(i) == 'E'){
conversion.at(i) = 'H';
}
if(input.at(i) == 'f' || input.at(i) == 'F'){
conversion.at(i) = 'I';
}
if(input.at(i) == 'g' || input.at(i) == 'G'){
conversion.at(i) = 'J';
}
if(input.at(i) == 'h' || input.at(i) == 'H'){
conversion.at(i) = 'K';
}
if(input.at(i) == 'i' || input.at(i) == 'I'){
conversion.at(i) = 'L';
}
if(input.at(i) == 'j' || input.at(i) == 'J'){
conversion.at(i) = 'M';
}
if(input.at(i) == 'k' || input.at(i) == 'K'){
conversion.at(i) = 'N';
}
if(input.at(i) == 'l' || input.at(i) == 'L'){
conversion.at(i) = 'O';
}
if(input.at(i) == 'm' || input.at(i) == 'M'){
conversion.at(i) = 'P';
}
if(input.at(i) == 'n' || input.at(i) == 'N'){
conversion.at(i) = 'Q';
}
if(input.at(i) == 'o' || input.at(i) == 'O'){
conversion.at(i) = 'R';
}
if(input.at(i) == 'p' || input.at(i) == 'P'){
conversion.at(i) = 'S';
}
if(input.at(i) == 'q' || input.at(i) == 'Q'){
conversion.at(i) = 'T';
}
if(input.at(i) == 'r' || input.at(i) == 'R'){
conversion.at(i) = 'U';
}
if(input.at(i) == 's' || input.at(i) == 'S'){
conversion.at(i) = 'V';
}
if(input.at(i) == 't' || input.at(i) == 'T'){
conversion.at(i) = 'W';
}
if(input.at(i) == 'u' || input.at(i) == 'U'){
conversion.at(i) = 'X';
}
if(input.at(i) == 'v' || input.at(i) == 'V'){
conversion.at(i) = 'Y';
}
if(input.at(i) == 'w' || input.at(i) == 'W'){
conversion.at(i) = 'Z';
}
if(input.at(i) == 'x' || input.at(i) == 'X'){
conversion.at(i) = 'A';
}
if(input.at(i) == 'y' || input.at(i) == 'Y'){
conversion.at(i) = 'B';
}
if(input.at(i) == 'z' || input.at(i) == 'Z'){
conversion.at(i) = 'C';
}
if(input.at(i) == ' '){
conversion.at(i) = ' ';
}
}
cout << conversion << endl;
return 0;
}
我不明白如何修复错误,我想帮助修复它。
您正在尝试在conversion
长度为零的 string 中设置字符。这就是您收到错误的原因。at()
对该字符串的所有调用都是无效的。
您需要先将输入字符串复制到 中conversion
,然后再进行修改。或者有reserve
足够的空间和push_back
字母进去。或者干脆一直使用input
。
您还可以以不那么冗长的方式进行“移位 3”,并尊重案例。
并且您希望一次读取整行输入,而不仅仅是单个字符串——因为这样的字符串永远不能包含空格:这就是获取一行与仅获取一个字符串之间的区别。
#include <iostream>
#include <string>
int main() {
using namespace std;
while (true) {
string input;
cout << "> " << flush;
if (!getline(cin, input) || input.empty()) return 0;
cin >> ws; // consume '\n'
for (char &c : input) {
char base = '\0';
if (c >= 'a' && c<= 'z') base = 'a';
else if (c >= 'A' && c <= 'Z') base = 'A';
if (base) {
c -= base;
c = (c + 3) % ('z' - 'a');
c += base;
}
}
cout << "< " << input << endl;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句