2016-12-07 7 views
0

私がしようとしているのは、ユーザーが好みの形式で電話番号を入力してから、ユーザーが各文字を比較するループを使用して入力に使用したヘルパー文字を削除する文字列中に別のヘルパー文字セットがある場合、一致するものがあればその文字を文字列から消去します。私は反復子の私の理解を深めるために、これを練習問題としてやっています。私はこれを簡単なforループで成功させました。しかし、 "(+"ループが次の文字のために実行されない "+"のような2つのヘルパー文字があるときはいつでも私はこの方法を私の驚きにしようとします。 "それは後でうまくいきます。他のヘルパー文字が後で文字列に現れるなら、同じ動作をします。私はこれを、最初のforループの直下に置いて確認しました< <このプログラムは、それがプットへと外になっているものを行うに失敗したから?どうなる「91892333」の代わりに所望の「91892333」で。文字列をループする際のイテレータの誤動作

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 

string main = "(+91)892-333"; 
string dictionary = "(+)-"; 

for(string::iterator i = main.begin(); i != main.end(); i++) 
{ 


    for(char word : dictionary) 
    { 

       if(*i == word) 
       { 
        main.erase(i); 
        break; 
       } 
    } 
} 

cout << main; 

} 

答えて

0

documentationによるeraseはイテレータを無効にします。あなたはerase呼び出しの後にそうiteratoを使わないでください前に得られたrsかUBを得る。あなたのケースでは、eraseはイテレータを変更しませんが、消去されたシンボル1のシンボルの後の文字列が残っていれば終了を移動します。だからイテレータは次の文字を指しています。しかし、その動作は保証されていません、std :: stringは新しいバッファを割り当ててデータをそこに移動し、古いイテレータはどこにも向いていないことがあります。

+0

イレーズ機能がチャームのように機能した後にi-を追加しましたが、イテレータを無効にしないでください。 –

+0

C++で書くと、ブーストを使うのが一般的です。それはSTLのための遊び場のようなものです。 boost/algorithm/string/erase.hppがあり、あなたが望むものとまったく同じ機能を見つけることができます。または、std :: remove_ifを使用して、substrを使用して文字列の未使用部分を削除することもできます。 –

関連する問題