2017-12-05 4 views
-1

Ich spielte mit Stacks herum, um das Konzept und die Implementierung besser zu verstehen, und ich stolperte über einen seltsamen Bug. Ich übergebe eine Zeichenfolge in eine Funktion, zerlege die Zeichenfolge in einzelne Zeichen und füge sie zu einem Stapel hinzu, aber als ich den Stapel ausgedruckt habe, waren es nicht die Daten, die ich eingegeben habe.String ändert sich in der Funktion unerwartet

Ich reparierte den Fehler (Ich habe es auskommentiert, um den Fehler neu zu erstellen), aber ich bin neugierig, warum dies passierte, die Fehlschlag übereinstimmende Ausgabe war konstant und nie geändert.

#include "stack.h" 
#include <string> 
#include <iostream> 

using namespace std; 

void bracketCheck(const std::string& s){ 
    Stack<char> stack; 

    // this works as expected: 

    /*for (auto i = s.begin(); i != s.end(); i++){ 
     stack.push(*i); 
     cout << stack.top() << endl; 
    }*/ 

    //this gives a jumbled outout: 

    for (auto i = s.front(); i != s.back(); i++){ 
     stack.push(i); 
     cout << stack.top() << endl; 
    } 
} 

void main(){ 
    string a = "stanley"; 
    bracketCheck(a); 
    system("pause"); 
} 

stack.h:

#include <list> 

using namespace std; 
template<class T> 

class Stack{ 
private: 
    list<T> data_; 
public: 
    Stack(){} 
    void push(const T& data){ 
     //v1 
     data_.push_front(data); 
    } 
    T top() const{ 
     list<T>::const_iterator it = data_.begin(); 
     return *it; 
    } 
}; 

der Ausgang ich erhalte:

s 
t 
u 
v 
w 
x 
+0

Versuchen Sie, 'auto' durch' std :: string :: iterator' zu ersetzen, wenn der Compiler Ihnen erklären soll, was die Ursache ist. – user3188346

Antwort

2

Die string::front() Funktion an der Vorderseite des Strings einen Verweis auf den tatsächlichen Charakter zurückgibt. Durch Schleifen mit erhöhen Sie tatsächlich den Inhalt des Strings selbst, ohne die Indizes des Strings zu durchlaufen.

Ziemlich urkomisch, eigentlich. Du bist sehr Glück, dass inkrementieren s 6 mal endet bei y, die gerade so ist das letzte Zeichen der Zeichenfolge, die Sie tatsächlich verwenden. So ist der Break-Zustand der for-Schleife (i != s.back()) gerade so erfüllt. Glücksfall. Wenn die Schnur so ziemlich alles andere gewesen wäre, würden Sie einen viel schlimmeren Unfall bekommen.

2

String Methoden front() und back() kehrt Verweise auf erste und letzte Zeichen der Zeichenfolge (Referenz auf char), die Eingabe-String ist ‚Stanley‘, nun einen Blick auf den ASCII-Code-Tabelle, s 115 in dezimaler ist und y 121 Im Dezimalformat haben Sie eine for-Schleife erstellt, die alle Werte im Bereich [115,121] gedruckt hat.

Verwandte Themen