为什么这会崩溃?

时间:2013-06-07 01:58:08

标签: c++

这是使用C ++的原则和实践的练习。你应该用一个你不喜欢的词,并让它“ble”出来。我得到了运行的代码,但在此之前,我编写了下面的代码,它崩溃了。我对它崩溃的原因更感兴趣?是 if(words [i-1] == dislike)?如果是这样,为什么不检查底部是否会导致程序崩溃?这可能是一个简单的答案,但我很想知道。

#include <iostream>
#include "std_lib_facilities.h"

using namespace std;

int main()
{
    vector<string> words;
    string temp;
    string dislike = "tuggo";

    while(cin>>temp)
        words.push_back(temp);

    cout << "Number of words: " << words.size() << endl;

    sort(words.begin(),words.end());

    for(int i = 0; i<words.size(); ++i)
    {
        if(words[i-1]==dislike)
            cout << "BEEP DONT SAY TUGGO WHOOPS I SAID TUGG--BEEP";
        else if(i==0 || words[i-1]!=words[i])
            cout << words[i] << endl;
    }

    keep_window_open();
}

4 个答案:

答案 0 :(得分:1)

您正在访问words[i-1],但i从零开始。您无法访问负面指数。

答案 1 :(得分:1)

问题是words[i-1]您从i = 0开始,所以第一次使用负索引是未定义的行为。

答案 2 :(得分:1)

if(words[i-1]==dislike)

在循环的第一次迭代中,它应该在这一行崩溃。

如果i = 0,并且您正在获取i-1的索引,则数组中不能有负索引。

答案 3 :(得分:1)

是,

for(int i = 0; i<words.size(); ++i)
{
    if(words[i-1]==dislike)
        cout << "BEEP DONT SAY TUGGO WHOOPS I SAID TUGG--BEEP";
    else if(i==0 || words[i-1]!=words[i])
        cout << words[i] << endl;
}

此处,当迭代开始时,i0,因此它将获取words[-1],这是无效的。

相关问题