0

私はこの問題に取り組むためにさまざまな手法を試してきましたが、C++やプログラミング全般にまったく慣れていません。この問題は、私が読んでいる「Accelerated C ++」という本から来ています。これまでのところ、私は第3章だけなので、第3章で教えられたことだけで問題に取り組んでいます。プログラムを実行すると正常に実行されますが、1つの単語を入力するとすぐに、セグメンテーション違反が発生します。なぜそれが起こっているのか誰かが私に説明できますか?また、私のやり方がこれまでに知っている知識で非常に非効率的である場合、章の境界内で物事を行うためのより良い方法を示唆することは素晴らしいことです!

コードは次のとおりです。

#include <iostream>
#include <algorithm>
#include <ios>
#include <string>
#include <vector>
#include <iomanip>

using namespace std;

int main()
{
    //ask for the first sentence to be typed in.
    cout << "Please enter some words: ";
    vector<string> word_storage;
    vector<int> word_count;
    string x;
    int y = 0;

    //words inputed pushed into vector(word_storage) or incremented if they exist
    while(cin >> x) {

        for(int i = 0; i <= y; i++) {
            if(x != word_storage[i]) {
                word_storage.push_back(x);
                word_count.push_back(1);
            } else {
                word_count[i] += 1;
            }
        }
        y++;
    }

    cout << endl;

    //get size of word_storage
    typedef vector<double>::size_type vec_sz;
    vec_sz size = word_storage.size();

    //system prints how many of each word exist
    for(int j = 0; j <= size; j++) {
        cout << "There are: " << word_count[j]
                << " of the word " << word_storage[j];
    }

    cout << endl;
    return 0;
}

PS私は目障りなコーディングについて高度に謝罪します。

4

2 に答える 2

1

ベクトルには独自のサイズが含まれています。おそらく2つのバグがあると思います。まず、forループの「<=」がベクトルの終わりから外れます。これは「<」である必要があります。次に、word_storageに単語を追加していないときにyを繰り返します。

私はあなたが見つけた部分はもっと似ているべきだと思います:

while(cin >> x) {
    for(int i = 0; i < word_storage.size(); i++) {
        if(x != word_storage[i]) {
            word_storage.push_back(x);
            word_count.push_back(1);
        } else {
            word_count[i] += 1;
        }
    }
}

行うことができる他のいくつかの改善もありますが、その中でも特に、構造を使用してストレージとカウントを同じベクトルに結び付け、イテレーターを使用することです。あなたがそれらの章に着くとき、それを考慮してください。

于 2013-03-03T02:00:46.937 に答える
0
for(int i = 0; i <= y; i++) {
        if(x != word_storage[i]) {

word_storage初期化されていない/空のベクトルです。また、空のベクトルにアクセスしようとすると、セグメンテーション違反が発生します。例として、ループの開始時に、ベクトルに添え字操作を実行するものはありません。

サイズが。より大きい場合は、で[]操作を実行します。word_storagei

于 2013-03-03T01:49:26.240 に答える