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

ここでは、反復が始まるとi0であるため、 がフェッチされますがwords[-1]、これは有効ではありません。

于 2013-06-07T02:01:10.507 に答える