将字母向前移动 3 个字母的程序,错误:在抛出 'std::out_of_range' 的实例后调用终止
Posted
技术标签:
【中文标题】将字母向前移动 3 个字母的程序,错误:在抛出 \'std::out_of_range\' 的实例后调用终止【英文标题】:Program that shifts letters 3 letters forward, error: terminate called after throwing an instance of 'std::out_of_range'将字母向前移动 3 个字母的程序,错误:在抛出 'std::out_of_range' 的实例后调用终止 【发布时间】:2018-12-01 03:10:50 【问题描述】:所以我正在开发一个使用凯撒密码转换普通字符串的简单程序,它只是将字符串的字母向前移动 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.at(i)
还有什么理由跳过输入的第一个字母? input.at(0)
是第一个字符。
【参考方案1】:
您正在尝试在长度为零的字符串conversion
中设置字符。这就是你得到错误的原因。对该字符串的所有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;
【讨论】:
以上是关于将字母向前移动 3 个字母的程序,错误:在抛出 'std::out_of_range' 的实例后调用终止的主要内容,如果未能解决你的问题,请参考以下文章
C语言 将一个字符串的前3个字母移动到最后,输出移动后的字符串。
第一个代码中的错误,但第二个正确“在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc Aborted(core dumped)”