2016-12-07 74 views
0

我想要做的是让用户输入他们喜欢的格式的电话号码,然后删除用户在其输入中使用的助手字符使用循环比较每个字符在带有另一组定义的助手字符的字符串中,如果存在匹配,则从字符串中擦除该字符。我将这作为练习问题来开发我对迭代器的理解。我已经成功完成了这个循环的小事。然而,当我尝试这样做的时候,只要有两个助手字符,例如“(+”循环不会为下一个字符(本例中为“+”)运行,它会直接跳到“9 “并且在那之后工作正常,如果其他辅助字符在字符串后面出现,它的行为也是一样的,我通过放置一个cout < < *我刚刚在第一个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

按照documentationerase无效迭代器。所以,你叫erase后你不能使用迭代rs之前获得或你得到UB。在你的情况下,erase不会改变迭代器,但如果删除符号后的字符串剩下一个符号,则移动结尾。所以你的迭代器现在指向下一个字符。但是这种行为是不能保证的,std :: string可能会分配新的缓冲区并将数据移动到那里,从而使旧的迭代器指向任何地方。

+0

得到它添加一个i--擦除功能后像一个魅力,但不应该迭代器失效? –

+0

当你在C++上编写时,使用boost非常常见。这是STL的一个游乐场。有boost/algorithm/string/erase.hpp,你可以在其中找到你想要的功能。或者你可以使用std :: remove_if,然后用substr删除未使用的字符串结尾。 –