2016-04-23 12 views
2

Ich versuche, einen Container zu verwenden, um den Iterator der Zeichenfolge s zu speichern, aber ich habe Segmentfehler, wenn ich es ausführe. Wie Sie im Folgenden sehen werden, scheint der Fehler mit char temp = **itbegin; zu kommen, es könnte bedeuten, dass ich über den vorherigen Iterator keinen Wert zuweisen kann.Wie verwende ich diesen Iterator richtig?

Warum ist es? Habe ich den Iterator missbraucht? Wie benutze ich den Iterator richtig?

#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

Um das zu beheben, schreiben Sie 'char temp = (* itbegin) [0];' –

+0

Sie sollten '#include ' hinzufügen, um den Code portierbar zu machen. –

Antwort

6

Ihr Problem kommt aus dem Zustand, auf dem Sie Iteratoren in Ihrem iteratorbox Vektor einzufügen.

Sie haben den Operator && verwendet, was bedeutet, dass jeder Buchstabe der Zeichenfolge allen Vokalen gleichzeitig entsprechen muss. Das bedeutet, dass kein Iterator eingefügt wird, und Sie versuchen dann, den begin() Iterator des Vektors zu dereferenzieren, der zufällig der Iterator der Vergangenheit ist. Dies führt zu undefiniertem Verhalten, das sich in Ihrem Fall als Absturz manifestiert.

Sie wahrscheinlich

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

als Bedingung verwendet werden soll.

+1

@TauBai, bitte [akzeptieren] (http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow) die Antwort, wenn es hilfreich ist. –

+0

Entschuldigung, ich wusste nicht die Option akzeptieren vor :-) –

0

Die Antwort von @ rems4e ist völlig in Ordnung, aber ich finde einen solchen Code leichter zu lesen und weniger fehleranfällig, wenn Sie die Vokale in ein Array stellen

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

, so dass Sie die passende Logik innerhalb kapseln Ihre reverseVowels in den Standard-Algorithmus any_of

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

Dies vermeidet viel wiederholende Prüfung (die schnell out-of-sync bekommen können, sollten Sie jemals ein anderes Alphabet (deutsch eg) verwenden)

+0

danke: -) –

Verwandte Themen