我遇到了字符串擦除功能的问题。我无法从某个索引中删除单个字符。 也许我不能使用int“i”作为迭代器?我想删除一些字符。
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
void deleteChars(string inputText, string inputChars);
int main(int argc, char *argv[])
{
string tekst1 = ("mama fama lilo babo sabo");
string tekst2 = ("mabo");
deleteChars(tekst1, tekst2);
system("PAUSE");
return EXIT_SUCCESS;
}
void deleteChars(string inputText, string inputChars){
int a = inputText.size();
int b = inputChars.size();
string tmp = inputText;
for(int i=0; i<a; i++){
for(int j=0; j<b; j++){
if(inputText.at(i)==inputChars.at(j)){
tmp.erase(i,1); //Here is my problem ?
}
}
}
inputText = tmp;
cout<<"text: "<<inputText<<endl;
}
我的错误:
This application has requested the Runtime to terminate it in an unusual way
答案 0 :(得分:12)
从位置5中删除一个字符后,位置6处的字符移动到位置5,字符串长度减少一个。如果您稍后尝试删除tmp
的最后一个字符,它将抛出异常,因为tmp
已经比您预期的短一个字符。迭代字符串向后以避免这种情况。
答案 1 :(得分:4)
首先,tmp
的大小等于inputText
的大小a
。
但是,只要您从tmp
中删除某个字符,其大小就会减1,变为a-1
,如果您第二次删除,则其大小将变为a-2
,因此上。因此,在某些时候,您可能会将大于或等于tmp
大小的索引传递给erase
函数,从而导致std::out_of_range
异常t处理,因此您的应用程序崩溃。