Program that shifts letters 3 letters forward, error: terminate called after throwing an instance of 'std::out_of_range'

Program that shifts letters 3 letters forward, error: terminate called after throwing an instance of 'std::out_of_range'

所以 我正在开发一个简单的程序,使用凯撒密码 转换普通字符串,它只是将字符串的字母向前移动 3 次,并解密它,只需撤消它(非常基本的东西),就像对我对 c++ 的理解(我是初学者)和 我收到一个错误 不在我的 IDE 中的简单测试(代码::Blocks),而是在控制台中:

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() 调用均无效。

您需要先将输入的字符串复制到conversion,然后再对其进行修改。或者 reserve 足够 space 和 push_back 个字母放入其中。或者一直使用 input

您也可以用不那么冗长的方式进行“移位 3”,并尊重大小写。

而且您希望一次读取整行输入,而不仅仅是单个字符串——因为这样的字符串永远不会包含白色 space:这就是获取一行与仅获取一个字符串之间的区别.

#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 = '[=10=]';
      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;
  }
}