0

这是一项来自《使用 C++ 的原则和实践》的练习你应该把一个你不喜欢的词“哔”出来。我让代码运行,但在我这样做之前我写了下面的代码并且它崩溃了。我更好奇为什么它会崩溃?是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

4 回答 4

1

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

于 2013-06-07T01:59:52.067 回答
1

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

于 2013-06-07T02:00:03.197 回答
1
if(words[i-1]==dislike)

在循环的第一次迭代期间,它应该在此行崩溃。

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

于 2013-06-07T02:00:24.103 回答
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;
}

在这里,当迭代开始时,iis 0,所以它将 fetch words[-1],这是无效的。

于 2013-06-07T02:01:10.507 回答