繁体   English   中英

在抛出'std::out_of_range' what() 实例后调用 C++ 终止:basic_string::replace: __pos

[英]C++ terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::replace: __pos

我正在为学校做一个项目,我被要求输入一个字符串,它会将字符串转换为“leet speak”。 在我的程序中,我接受用户输入,然后将其传递给一个方法,该方法为字符串中的每个字符搜索一个数组。 当它找到该字符时,它会用第二个数组中的适当字符替换它。 我遇到了与数组大小和用户输入相关的问题。

#include <iostream>
#include <string>
using namespace std;

void leetTranslate(string input) {
  int length = input.length();
  cout << length;
  char normalLetters[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
  string leetLetters[26] = {"4","B","(","D","3","Ph","9","|-|","1","j","|<","L","/\\/\\","|\\| ","0","P","Q",
  "R","$","7","U","\\/","\\/\\/","><","'/","Z"};

  for (int j = 0; j < length; j++) {
    for (int i = 0; i < 26; i++) {
      if (input[j] == normalLetters[i]) {
        input.replace(j,1,leetLetters[i]);
      }
    }
  }

  cout << input;
  

}

int main() {
  string userInput;
  cout << "Enter a string: ";
  getline(cin, userInput);

  leetTranslate(userInput);
}

它产生错误: terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::replace: __pos (which is 116) > this->size() (which is 4)

在你线上:

input.replace(input[j],1,leetLetters[i]);

replace的签名是str.replace(size::t pos, size::t count, string str2)

pos是字符串中要开始替换的字符的索引号。 现在您正在从input传入第一个char ,这可能是't' 't'将转换为数字116 ,它比字符串的大小大得多,这就是它超出范围的原因。

因此,如果您想将第一个字母替换为相应的字符串,您可以这样做:

input.replace(j, 1, leetLetters[i]);

编辑:

关于您的函数停在中间的问题是因为您的第一个for循环for (int j = 0; j < length; j++)

请注意,这里的length从未改变,即使您实际上可能已经更改了input的长度。 例如,如果您的输入中有一个'w' ,那么它将被更改为"\\/\\/" ,这会在您的input添加 3 个char 因此,如果您的输入是"what" ,则您的长度将为4 更改'w' ,它将变为"\\/\\/hat" 您的函数仅替换到length th 个字符,因此"hat"将保持不变。

相反,您可以做的只是在 for 循环中的input.length()中过去,所以它将是:

for (int j = 0; j < input.length(); j++)

另请注意,这仅适用于替换字母与普通字母不重叠的情况,如果它们确实重叠,则您希望通过leetLetters[i].length() - 1在函数leetLetters[i].length() - 1 j添加增量,因此您将添加j += leetLetters[i].length() - 1在函数内部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM