2016-10-02 7 views
0

Mein Programm soll eine Zeichenfolge lesen und dann jedes Zeichen in den Stapel einfügen. Ich bemerkte, wenn ich das length drucke, das die Größe des Wortes ist, ändert es sich zu irgendeiner hohen Zahl. Zum Beispiel: word = "hello" Länge wird = 5 zuerst aber schließlich zu ändern = 111. Auch wenn ich 2 Buchstaben verwende, bekomme ich immer einen Segmentierungsfehler. Was verursacht das? Warum ändert sich die Länge des Wortes?C++ Stringgröße ändert sich während der Schleife

#include <iostream> 
#include <string> 
#include "Stack.h" 
using namespace std; 
int main() 
{ 
    Stack stack; 
    string word; 

    cout << "Enter word: "; 
    getline(cin, word); 
    cout << word << "|" << endl; 
    int length = word.size(); 
    for (int i = 0; i < length; i++) { 
     cout << "i: " << i << "\tlength: " << length << endl; 
     stack.push(word[i]); 
     cout << "TOP: " << stack.top() << endl; 
    } 



    while (!stack.isEmpty()) 
    { 
     cout << stack.pop(); 
    } 
    cout << endl; 
    return 0; 
} 


#include <iostream> 
#include <string> 
#define STACK_CAPACITY 1000 
using namespace std; 
class Stack 
{ 
    private: 
     int topIndex; 
     char arr[]; 

    public: 
     // Constructor 
     Stack() 
     { 
      arr[STACK_CAPACITY]; 
      topIndex = -1; 
     } 

     // adds elements to "top" of array 
     void push(char c) 
     { 
      // if stack is full, do not add 
      if (isFull()) 
      { 
       cout << "Push on full Stack" << endl; 
       // terminate function 
      } 
      topIndex++; 
      arr[topIndex] = c; 
     } 

     // Removes last inserted (push) element from the stack and returns it 
     char pop() 
     { 
      // checks if Stack is empty 
      if (isEmpty()) 
      { 
       cout << "Pop on empty Stack" << endl; 
       return '@'; 
      } 

      // if not empty, remove and return last element inserted 
      char temp = arr[topIndex]; 
      arr[topIndex--] = ' '; 
      return temp; 
     } 

     // Returns but does not remove last inserted (push) element 
     char top() { return arr[topIndex]; } 

     // Utilities 
     bool isEmpty() { return topIndex == -1; } 
     bool isFull() { return topIndex == STACK_CAPACITY - 1; } 
     int size() { return topIndex + 1; } 

     // Destructor 
     ~Stack() 
     { 

     } 

} 
+5

Ändern Sie Ihre Deklaration von 'char arr []' in 'char arr [STACK_CAPACITY]' –

+3

"arr [STACK_CAPACITY];" ist sinnlose Aussage und tut absolut nichts. 'arr' bleibt ein Array der Länge 0 und versucht, Zeichen hinzuzufügen, was zu undefiniertem Verhalten und Speicherkorruption führt. –

+0

warum hasst du die stl? Verwenden Sie einfach std :: stack Bonan

Antwort

4

Es gibt verschiedene Probleme in Ihrer Stack Klasse, die sie verursachen nicht definiertes Verhalten zeigen.

Zum Beispiel im Konstruktor

Stack() 
    { 
     arr[STACK_CAPACITY]; 
     topIndex = -1; 
    } 

nicht (wie ich denke, Sie erwarten) die Größe arrSTACK_CAPACITY Elemente haben. Es versucht, den Wert von arr[STACK_CAPACITY] auszuwerten, der, da arr wie char arr[] deklariert wird, nicht vorhanden ist. Daher hat diese Aussage undefiniertes Verhalten.

ähnliche Weise wird die push() Memberfunktion

// adds elements to "top" of array 
    void push(char c) 
    { 
     // if stack is full, do not add 
     if (isFull()) 
     { 
      cout << "Push on full Stack" << endl; 
      // terminate function 
     } 
     topIndex++; 
     arr[topIndex] = c; 
    } 

Versuche (auf dem ersten Aufruf) arr[0] zu ändern - die nicht existiert auch.

Wenn das Verhalten undefiniert ist - wie oben beschrieben - kann alles passieren. Einschließlich erscheint, um nicht verwandte Daten zu überschreiben oder (in Ihrem Fall) Teile der Zeichenfolge word in main() zu überschreiben.

Sie müssen besser auf die Grundlagen von C++ lesen, anstatt zu erraten, wie die Dinge funktionieren. Sie haben SEHR falsch vermutet.

+0

Das hat überhaupt nicht funktioniert. Es führte zu einem noch schlimmeren Segmentierungsfehler und erzeugte mehrere seltsame Dateien namens core. #### – Chrismar

+0

Was hat nicht funktioniert? Ich habe Ihren Code mit korrekter Deklaration getestet und es hat gut funktioniert. Fügen Sie auch eine Begrenzungsprüfung hinzu, zum Beispiel ändern Sie 'arr [topIndex] = c' nach 'if (topIndex> = 0 && topIndex

+0

Ich habe nur das Problem beschrieben, Chrismar. Und die einzige Lösung, die ich beschrieben habe, ist, besser über die Grundlagen von C++ nachzudenken, damit Sie Code schreiben können, der das tut, was Sie erwarten, anstatt etwas anderes. Wenn das nicht funktioniert hat, bedeutet das, dass Sie dem Rat nicht gefolgt sind, d. H. Sie raten immer noch und denken überhaupt nicht darüber nach, was Sie tun. Der Code in meiner Antwort ist ein direktes Zitat von YOURS - ich habe es nicht geändert. Wenn Sie also den Code aus meiner Antwort kopieren/einfügen, haben Sie immer noch den gleichen Code, mit dem Sie begonnen haben. – Peter

Verwandte Themen