2017-12-05 17 views
-1

私はスタックを使ってコンセプトと実装をよく理解していましたが、私は奇妙なバグに遭遇しました。文字列を関数に渡し、文字列を個々のcharに分解してスタックに追加していますが、スタックを印刷したときに入力したデータではありませんでした。突然関数の文字列が変更される

私はバグを修正しました(エラーを再現するためにコメントしました)が、なぜこのようなことが起こったのか不思議です。

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

私は取得しています出力:

s 
t 
u 
v 
w 
x 
+0

根本原因が何であるかをコンパイラに説明させたい場合は、 'auto'を' std :: string :: iterator'に置き換えてみてください。 – user3188346

答えて

2

string::front()関数は、文字列の前にある実際の文字への参照を返します。 for (auto i = s.front(); i != s.back(); i++)でループすると、実際にはの文字列のインデックスをループしないで、文字列自体の内容をインクリメントしています。

実際には陽気です。あなたは非常にです。sを6回増やすと、yになります。実際に使用する文字列の最後の文字になります。そのため、for-loop(i != s.back())のブレーク条件が満たされただけです。ラッキーな休憩。ストリングが他の何もかもであったなら、あなたはもっと厄介なクラッシュを受けるでしょう。

2

文字列メソッド文字列の最初と最後の文字(文字参照)にfront()back()戻って参照、あなたの入力文字列は、「スタンレー」で、今sは10進数で115であり、yは121で、ASCIIコード表を見て小数点では、範囲[115,121]内のすべての値を出力するforループを作成しました。

関連する問題