-1

文字列からの消去機能に問題があります。特定のインデックスから 1 文字も削除できません。多分私は int "i" を iterator として使うことはできませんか?一部の文字を削除したい。

#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
4

2 に答える 2

12

たとえば、位置 5 から文字を消去すると、位置 6 にあったものが位置 5 に移動し、文字列の長さが 1 つ短くなります。後で の最後の文字を消去しようとすると、 が予想よりも 1 文字短いtmpため、例外がスローされます。これを回避するには、文字列を逆方向tmpに反復処理します。

于 2012-04-11T17:57:25.533 に答える
4

最初は、 のサイズは のサイズtmpと同じinputTextですa

しかし、 から文字を消すとすぐにtmp、そのサイズは 1 減って になりa-1、2 回目に消すとそのサイズは になりa-2ます。そのため、ある時点で、のサイズ以上のインデックスをtmp関数eraseに渡す可能性があります。その結果、std::out_of_range処理しない例外が発生し、アプリケーションがクラッシュします。

于 2012-04-11T17:59:30.287 に答える