2016-10-02 2 views
0

プログラムでは、文字列を読み取り、各文字をスタックに挿入することを想定しています。私は、単語のサイズであるlengthを印刷すると気付きましたが、それは高い数字に変わります。たとえば、word = "hello"の長さは最初は5になりますが、最終的には= 111に変更されます。また、私は2つの文字を使用すると、私はいつもセグメンテーション違反を取得します。これを引き起こしているのは何ですか?なぜ言葉の長さは変わるのですか?ループ中にC++の文字列サイズが変更される

#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

あなたの宣言を 'char arr []'から 'char arr [STACK_CAPACITY]' –

+3

"arr [STACK_CAPACITY];に変更してください。無意味な陳述であり、絶対に何もしません。 'arr'は長さ0の配列のままです。文字を追加しようとすると、未定義の動作とメモリ破損が発生します。 –

+0

なぜあなたはstlを嫌いですか? std :: stackを使用してください。 Bonan

答えて

4

それは未定義の振る舞いを示すことが原因あなたのStackクラスの様々な問題があります。コンストラクタ

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

(私が推測する、として、あなたが期待している)しないarrのサイズを変更で例えば

は、STACK_CAPACITY要素を持っています。 arr[STACK_CAPACITY]の値を評価しようとします。arrchar arr[]と宣言されているため、存在しません。したがって、その文は未定義の動作をします。同様

push()メンバ関数arr[0]を変更する

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

試み(最初の呼び出しに) - も存在しません。

動作が定義されていない場合(上記のように)、何かが起こる可能性があります。無関係のデータを上書きするか、またはwordの文字列の上書き部分を(あなたの場合は)main()に含めます。

どのように動作するかを推測するのではなく、C++の基本をよりよく理解する必要があります。あなたは非常に間違って推測しています。

+0

これはまったく動作しませんでした。セグメンテーションエラーがさらに悪化し、コアと呼ばれる複数の奇妙なファイルが作成されました。#### – Chrismar

+0

何がうまくいかなかったのですか?あなたのコードを正しい宣言でテストしたところ、正常に動作しました。また、境界チェックを追加すると、例えば 'arr [topIndex] = c'を' if(topIndex> = 0 && topIndex

+0

私が記述した唯一の解決策は、C++の基本をよりよく理解することです。そうすれば、何か他のものよりもむしろ期待することをするコードを書くことができます。それがうまくいかなかった場合は、あなたがまだ推測しているアドバイスに従わず、何をしているのか全く考えていないことを意味します。私の答えのコードはあなたの直接の引用です - 私はそれを変更していません。したがって、あなたが私の答えからコードをコピー/ペーストした場合、あなたはあなたが始まった同じコードをまだ持っています。 – Peter

関連する問題