如何擦除字符串中的字符?

时间:2012-04-11 17:51:06

标签: c++ string erase

我遇到了字符串擦除功能的问题。我无法从某个索引中删除单个字符。 也许我不能使用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

2 个答案:

答案 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处理,因此您的应用程序崩溃。