![](/img/trans.png)
[英]c++ terminate called after throwing an instance 'std::out_of_range' what(): basic_string::substr: __pos > this->size()
[英]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.