2016-04-23 17 views
2

我想使用一個容器來存儲字符串s的迭代器,但我運行它時遇到了段錯誤。正如你在下面看到的,這個錯誤似乎與char temp = **itbegin;一起出現,這可能意味着我不能通過前面的迭代器賦值。如何正確使用這個迭代器?

爲什麼?我誤用了迭代器嗎?如何正確使用迭代器?

#include <iostream> 
#include <vector> 
using namespace std; 
string reverseVowels(string s); 

int main() 
{ 
    string s ="hello"; 
    cout << reverseVowels(s); 
} 
string reverseVowels(string s) { 
    string::iterator iter = s.begin(); 
    string::iterator iterend = s.end(); 
    vector<string::iterator> iteratorbox; 
    for(;iter != iterend ; ++iter){ 
     if((*iter) == 'a' && 
      (*iter) == 'e' && 
      (*iter) == 'i' && 
      (*iter) == 'o' && 
      (*iter) == 'u'){ 
       iteratorbox.push_back(iter); 
      } 

    } 
    auto itbegin = iteratorbox.begin(); 
    auto itend = iteratorbox.end() ; 
    --itend; 
    //for(;itbegin < itend ; ++itbegin, --itend) 
    { 
     char temp = **itbegin; 
    // *(*itbegin) = *(*itend); 
    // *(*itend) = temp; 
    } 
    return s; 
} 
+0

修正寫'char temp =(* itbegin)[0];' –

+0

您應該添加'#include '使代碼變得可移植。 –

回答

6

您的問題來自您在iteratorbox向量中插入迭代器的條件。

您使用了&&算子,這意味着字符串的每個字母必須與同時相等。這意味着不會插入迭代器,然後嘗試取消引用向量的迭代器,這恰好是它的過去末端迭代器。這會導致未定義的行爲,在您的情況下,它表現爲崩潰。

你可能想用的

((*iter) == 'a' || 
(*iter) == 'e' || 
(*iter) == 'i' || 
(*iter) == 'o' || 
(*iter) == 'u') 

爲條件。

+1

@TauBai,請[接受](http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow)答案,如果有幫助的話。 – 2016-04-23 11:24:35

+0

對不起,我之前不知道接受選項:-) –

0

通過@ rems4e答案是完全正常的,但我覺得這樣的代碼更易於閱讀和更不容易出錯,如果你把元音到一個數組

char const vowels[] = { 'a', 'e', 'i', 'o', 'u' }; 

,這樣就可以封裝內部的匹配邏輯您reverseVowels到標準算法any_of

if (std::is_any_of(std::begin(vowels), std::end(vowels), [](auto const& v) { 
    return *iter == v; 
}) { 
    iteratorbox.push_back(iter); 
} 

這樣就避免了很多重複的測試(可以擺脫不同步很快,你應該永遠使用不同的字母(如德國))

+0

謝謝你: - ) –

相關問題