c++:分割错误(核心转储)

c++: segmantation fault (core dumped)

本文关键字:核心 转储 错误 分割 c++      更新时间:2023-10-16

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

#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 openedn";
        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 openedn";
    return 0;
}

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

vdist[j] = v[i];

为什么会发生这种情况?

vdist为空,因此vdist[j]为越界

相反,看起来你想把值压入vector的末尾:

vdist.push_back(v[i]);

一旦你做了这个改变,j变量将是多余的,所以你应该删除它。

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