Chrismar
Chrismar

Reputation: 93

C++ string size changing during loop

My Program is suppose to read a string and then insert each character into the stack. I noticed when I print the length, which is the size of the word, it changes to some high number. For example: word = "hello" length will = 5 at first but eventually change to = 111. Also When I use 2 letters I always get a segmentation fault. What is causing this? Why is the length of the word changing?

#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() 
        {

        }

}

Upvotes: 0

Views: 549

Answers (1)

Peter
Peter

Reputation: 36597

There are various problems in your Stack class that cause it to exhibit undefined behaviour.

For example, in the constructor

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

does not (as, I guess, you are expecting) resize arr to have STACK_CAPACITY elements. It attempts to evaluate the value of arr[STACK_CAPACITY] which, since arr is declared as char arr[], does not exist. Hence that statement has undefined behaviour.

Similarly, the push() member function

    // 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;
    }

attempts (on the first call) to modify arr[0] - which also does not exist.

When behaviour is undefined - as it is in the above - anything can happen. Including appearing to overwrite unrelated data or (in your case) overwriting parts of the string word in main().

You need to read up better on the basics of C++, rather than guessing about how things work. You have guessed VERY incorrectly.

Upvotes: 4

Related Questions