循环通过字符串时迭代器出现故障

时间:2016-12-07 07:05:13

标签: string loops c++11 iterator char

我要做的是让用户以他们喜欢的格式输入电话号码,然后使用循环删除用户在输入中使用的帮助字符,该循环将字符串中的每个字符与另一个字符进行比较一组已定义的帮助字符,如果有匹配则从字符串中删除该字符。我这样做是为了培养我对迭代器的理解。我用琐碎的for循环成功完成了这个。然而,当我尝试这样做的时候,只要有两个辅助字符,比如“(+”循环不会为下一个字符运行,在这种情况下是“+”,它会让我惊讶。它直接跳到“9” “并且在那之后工作正常。如果字符串中稍后出现其他帮助字符,它会执行相同的行为。我通过在第一个for循环下放置一个cout<< * i来检查这个。我不明白为什么会发生这种情况呢?因为这个程序没有按照预期的那样做,而是把“+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;

}

1 个答案:

答案 0 :(得分:0)

根据documentation erase使迭代器无效。因此,在调用erase之后,您不能使用之前获得的迭代器或者您获得UB。在你的情况下,erase不会改变迭代器,但如果删除了符号后面的字符串,则移动结束符号。所以你的迭代器现在指向下一个字符。但是这种行为并不能得到保证,std :: string可能会分配新的缓冲区并将数据移到那里,让旧的迭代器指向无处。