代码中的分段错误

Posted

技术标签:

【中文标题】代码中的分段错误【英文标题】:segmentation fault in code 【发布时间】:2012-11-21 11:31:27 【问题描述】:

我是 C++ 的新手,我想做的是从 .csv 文件中读取并将其存储在向量中然后显示,我的问题是代码在最后一个 reqd 条目后崩溃是从终端运行时从文件中显示,但在 ide (codeblocks) 中,当我尝试调试它时显示 sigsegv 错误...

ps:我想要将文件读入向量的原因是以后能够进入mysqldb

#include <vector>
#include <string>
#include <sstream>
#include<fstream>
#include <iostream>

using namespace std;
vector<string> split_at_commas(const string& row)

    vector<string> res;
    istringstream buf(row);
    string s;
    while (getline(buf, s, ','))
        res.push_back(s);
    return res;
 

int main()

    string line;
    ifstream  data("Book1.csv" ,ios::out);
    while(!data.eof())
    
        getline(data,line,'\n');
        vector<string> v = split_at_commas(line);
        /*ide points error to this line*/ 
        cout << v[0] << '\t' << v[1] <<'\t' << v[2]<< '\t'<<endl;                  
    
    data.close();

【问题讨论】:

你的代码缩进很糟糕,你应该感到很糟糕。请修复 你能发布你的数据文件吗?你可能有一行没有三列,所以你试图访问一个不存在的元素。 很可能,您的最后一条记录的值少于 3 个,这使得 v[2] 违反了数组的边界。 很难说,也许您在错误的索引处访问 v(超出范围)。你为什么不先检查 v 的大小...... 【参考方案1】:

不保证 'v' 包含三个或更多元素。在调用 split_at_commas 之后和在调试器中打印之前检查 'v' 的内容,以验证 v 是否包含 3 个或更多项。

【讨论】:

或者更好的是,使用迭代器遍历每个条目。这样,您将只打印尽可能多的实际条目。 很棒的通用方法,在这里绝对是一个不错的选择。我假设他的输入文件每行总是三个单词,所以如果 v 中有任何内容,它将是三个元素。对于其他场景,您的建议会更好。 @fayyazkl 非常感谢,我只是将输出放在一个循环中,它可以工作,循环如下for(unsigned int i=0;i&lt;v.size();i++)

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

mov指令中的分段错误

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

线程示例,分段错误

确定导致分段错误的代码行?

pyqt5 中的分段错误(核心转储)

C++ 分段错误 OpenCV