C ++向量分段错误

时间:2017-09-14 20:34:35

标签: c++ vector segmentation-fault

我正在处理一个有输入文件的程序,它可以添加,删除或打印字符串。我的print函数正常工作,但是当我取消显示所显示的代码行时,我遇到了分段错误。

int main()
{
    vector <string> vec; //Creates an empty vector
    string command;
    string word;
    int index;

    ifstream fin;
    fin.open("datalabvec.dat"); //Opens the input file

    if (!fin)
        cout << "The input file does not exist" << endl << endl;
    else
    {
        fin >> command;

        while (fin)
        {
            if (command =="Add")
            {
                fin >> word >> index;
                //addVec (vec, word, index);
            }
            //if (command == "Remove")
            //{
                //fin >> index;
                //remVec (vec, index);
            //}
            // else //Print function
            {
                printVec(vec);
            }
            fin >> command;
        }
    }
}

void addVec(vector <string> &v, string word, int ind)
{
    int size = v.size();
    if (ind > size + 1)
        cout << "Invalid adding at index " << ind << endl;
    else
    {
        v.insert(v.begin()+ind, word);
    }
}

void remVec(vector <string> &v, int ind)
{
    int size = v.size();
    if (ind > size)
        cout << "Invalid removing at index " << ind << endl;
    else
    {
        v.erase(v.begin() + ind);
    }
}

void printVec(const vector <string> v)
{
    int size = v.size();

    for (int i = 0; i < size; i++)
    {
        cout << v[i] << "\t";
    }
    cout << endl;
}

输入文件

Remove      0
Add Student 0
Add Kid     0
Add Final   1
Add Grow    1
Add Note    2
Add Bad     6
Remove      5
Add Worse   -1
Print
Add Rich    5
Remove      1
Remove      7
Add Mind    2
Remove      3
Print

1 个答案:

答案 0 :(得分:0)

在你的添加功能中。我猜你错误地在if语句中写了大小+ 1。它应该是size-1,因为vector的最后一个成员的大小为1。 [0] - [size-1]。正确的陈述是if(ind&gt; = size)或ind&gt;大小-1。就像你在编写器函数中用于for循环一样。

正如布拉德在下面的评论中所说。最好检查天气ind&gt; = 0。

void addVec (vector <string> &v, string word, int ind)
{
  int size = v.size();
  if (ind < 0 || ind >= size)
    cout << "Invalid adding at index " << ind << endl;
  else
    {
      v.insert(v.begin()+ind, word);
    }
}

void remVec (vector <string> &v, int ind)
{
  int size = v.size();
  if (ind < 0 || ind >= size)
    cout << "Invalid removing at index " << ind << endl;
  else
    {
      v.erase(v.begin() + ind);
    }
}