【问题标题】:c++: segmantation fault (core dumped)c++:分段错误(核心转储)
【发布时间】:2014-06-26 17:25:53
【问题描述】:

我的程序的目的是读取文件中的单词并计算每个单词的出现次数。代码如下:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<string> v, vdist;
    string parola;
    int j=0;
    ifstream myfile("example.txt");
    if (myfile.is_open()) {
        cout << "file opened\n";
        while (! myfile.eof() ) {
            myfile >> parola;
            v.push_back(parola);
        }
        cout << "dimensione file: " << v.size() << endl;
        for (int i=0; i< v.size(); i++) {
            cout << i << "   " << v[i] << endl;
        }
        sort(v.begin(),v.end());
        for (int i=0; i<= v.size()-1; i++) {
            if (v[i] != v[i+1]) {
                vdist[j] = v[i];
                cout << vdist[j] << endl;
                j++;
            }
            vdist[j]= v[v.size()-1];
            j++;
        }
    } else 
        cout << "file not opened\n";

    return 0;
}

我要做的就是创建一个向量vdist,其中包含所有不同的单词,并计算每个单词的出现次数。显然这不是最好的方法,但它只是学习。 产生分段错误的行是这样的:

vdist[j] = v[i];

为什么会这样?

【问题讨论】:

    标签: c++ fault


    【解决方案1】:

    vdist 为空,因此vdist[j] 超出范围。

    相反,您似乎想将值推到向量的末尾:

    vdist.push_back(v[i]);
    

    一旦您进行了更改,j 变量将是多余的,因此您应该删除它。

    最后一次迭代也有问题,v[i+1] 越界。您需要解决这个问题 - 可能通过提前停止一次迭代,或者可能通过将最终迭代与其他迭代区别对待。

    【讨论】:

    • 另外,作为一般规则,当您访问一个容器时,如果它是一个指针,请确保该容器存在,并且索引没有超出范围。如果容器来自 stl,你可以使用 iterator 来遍历它,这样更安全。
    • 是的!我真蠢!!非常感谢,现在完美运行!再次感谢!
    猜你喜欢
    • 2022-01-14
    • 2017-02-25
    • 2016-07-12
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多