2016-12-07 69 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刪除未使用的字符串結尾。 –