C++ 向量分段错误

Posted

技术标签:

【中文标题】C++ 向量分段错误【英文标题】:C++ Vectors Segmentation Fault 【发布时间】:2017-09-14 20:34:35 【问题描述】:

我正在开发一个具有输入文件的程序,它可以添加、删除或打印字符串。我的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

【问题讨论】:

您提到了注释代码,但您的示例中没有任何 cmets...实际上,您的打印功能也丢失了。 那是因为您的两个函数都允许 UB 用于某些输入。修正你的比较。 有问题吗? 【参考方案1】:

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

正如布拉德在下面的评论中所建议的那样。检查天气 ind >= 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);
    

【讨论】:

显然,还必须将索引与零进行比较。 索引不能为0?

以上是关于C++ 向量分段错误的主要内容,如果未能解决你的问题,请参考以下文章

带有向量和字符串的 C++ 分段错误

在 C++ 中比较来自向量的字符串时出现分段错误

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

C++:当我添加看似无关的代码行时,分段错误消失了

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

c++向量分配错误分段错误