0

我一直在尝试不同的技术来解决这个问题,而且我对 C++ 或一般编程很陌生。这个问题来自我正在阅读的一本名为“Accelerated C++”的书,到目前为止我只在第 3 章,所以我试图只用第 3 章中所教的内容来解决这个问题。当我运行程序时,它运行良好,但是只要我输入一个单词,就会出现分段错误。谁能向我解释为什么会这样?此外,如果我的方法对我目前所知道的知识来说效率极低,那么在章节边界内暗示一种更好的做事方式会很棒!

这是代码:

#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

向量包含自己的大小。我相信你可能有两个错误。首先,你的 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_storage,如果它的大小大于i

于 2013-03-03T01:49:26.240 回答