字符串意外更改功能

时间:2017-12-05 06:40:23

标签: c++

我正在玩堆栈以更好地理解概念和实现,我偶然发现了一个奇怪的错误。我将一个字符串传递给一个函数,将字符串分解为单个字符串并将它们添加到堆栈中,但是当我打印堆栈时,它不是我输入的数据。

我修复了错误(我将其评论为重新创建错误),但我很好奇为什么会发生这种情况,错过匹配的输出是不变的,永远不会改变。

#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

2 个答案:

答案 0 :(得分:2)

string::front()函数返回对字符串前面的实际字符的引用。通过使用for (auto i = s.front(); i != s.back(); i++)循环,您实际上会递增字符串本身的内容,而不是循环遍历字符串的索引。

实际上非常搞笑。你非常非常幸运的是,递增s 6次最终会在y,这恰好是你实际使用的字符串的最后一个字符。因此,恰好满足for循环(i != s.back())的中断条件。幸运的休息。如果字符串几乎是其他任何东西,那么你会得到更严重的崩溃。

答案 1 :(得分:2)

字符串方法front()back()返回对字符串的第一个和最后一个字符的引用(引用char),输入字符串是&#39; stanley&#39;,现在查看ASCII代码table,s十进制为115,y为十进制121,为循环创建,打印范围[115,121]中的所有值。