c++分割错误-核心转储
C++ Segmentation Fault - Core Dumped
我已经有这个问题一段时间了,我已经搜索了这种类型的错误,我相信它与内存泄漏或指向什么都没有的指针有关。
我一遍又一遍地检查了我的代码,我无法准确地找到这个问题发生的地方,因为我不知道如何调试它。即使我尝试在代码的第一行设置断点,它也会崩溃。
它正在从文件中读取一堆ISBN,并检查它们是否有效。
虽然看起来很多,但逻辑很简单。
下面是我的代码:#include <iostream>
#include <fstream>
#include <iomanip>
#include <list>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <vector>
using namespace std;
class Isbn
{
private:
string isbnCode;
public:
Isbn()
{
}
Isbn(string isbn): isbnCode(isbn)
{
}
~Isbn()
{
}
string getIsbn()
{
return isbnCode;
}
void setIsbn(string input)
{
isbnCode = input;
}
};
void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn);
void validateIsbns(const list<Isbn> listOfIsbn, list<bool> &validations);
void printValidations(const list<Isbn> listOfIsbn,
const list<bool> validations);
string bToS(const bool bValue);
int main(int argc, char *argv[])
{
list<Isbn> listOfIsbn;
list<bool> validations;
string inputFile = argv[1];
setListOfIsbn(inputFile, listOfIsbn);
validateIsbns(listOfIsbn, validations);
printValidations(listOfIsbn, validations);
return 0;
}
void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn)
{
list<Isbn>::const_iterator iterator;
ifstream fin;
fin.open(filename.c_str());
char ch;
string isbnCode;
while (!fin.eof())
{
fin.get(ch);
if (ch == 'n')
{
Isbn isbn;
(isbn).setIsbn(isbnCode);
listOfIsbn.push_back(isbn);
isbnCode = "";
}
else
{
isbnCode.append(reinterpret_cast<const char*>(ch));
}
}
}
void validateIsbns(const list<Isbn> listOfIsbn, list<bool> &validations)
{
list<Isbn>::const_iterator itr;
for (itr = listOfIsbn.begin(); itr != listOfIsbn.end(); itr++)
{
Isbn isbn = *itr;
string isbnCode = isbn.getIsbn();
string isbnCodeReform = "";
vector<int> products;
int sumOfProducts = 0;
unsigned int i;
for (i = 0; i < isbnCode.length(); itr++)
{
if(isalnum(isbnCode[i]))
{
isbnCodeReform[i] = isbnCode[i];
}
}
for (i = 0; i < (isbnCodeReform.length() - 1); itr++)
{
if(isbnCodeReform[i] == 'X')
{
isbnCodeReform[i] = 10;
}
products[i] = isbnCodeReform[i] * (10 - i);
}
vector<int>::const_iterator itr;
for (itr = products.begin(); itr != products.end(); itr++)
{
sumOfProducts += products[*itr];
}
if ((sumOfProducts % 11) == 0)
{
validations.push_back(true);
}
else
{
validations.push_back(false);
}
}
}
void printValidations(const list<Isbn> listOfIsbn,
const list<bool> validations)
{
list<Isbn>::const_iterator itr;
list<bool>::const_iterator itr2 = validations.begin();
for(itr = listOfIsbn.begin(); itr != listOfIsbn.end(); itr++)
{
string validate = bToS(*itr2);
Isbn isbn = *itr;
cout << isbn.getIsbn() + ": " + validate + "n";
itr2++;
}
}
string bToS(const bool bValue)
{
if(bValue == 0)
{
return "False";
}
else
{
return "True";
}
}
任何帮助将非常感激!
我已经尽可能详细地说明了这些明显的错误。可能还有更多。有了这么多的错误,很明显你采用了错误的编程方法。首先,你应该清楚地考虑你正在编写的代码,仅仅编写一些看起来大致正确的代码是不够的,通过编程你必须使它完全正确。其次,你写了太多低质量的代码。你应该先写几行代码,让它们能够正常工作,然后再写其他代码。你在这里堆积了一个又一个错误,所以很明显你没有做任何测试。即使是专业人士也无法做到这一点,更不用说初学者了。工作意味着工作,而不仅仅是编译。正如这段代码所示,编写大量可编译的代码是很容易的。最后学会使用调试器,这将有助于加载。显然,您设置了某种复杂的客户机/服务器。忘掉这些吧,在你自己的机器上安装一个编译器和调试器。
isbnCode.append(reinterpret_cast<const char*>(ch));
是错误的
isbnCode += ch;
是你想要的。除非你真的知道你在做什么,否则不要使用reinterpret_cast。
while (!fin.eof())
{
fin.get(ch);
是检查文件
结束的错误方法while (fin.get(ch))
{
就是你想要的。
事实上整个void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn)
太复杂了。它的作用完全相同,但只用了三倍的代码
void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn)
{
ifstream fin(filename.c_str());
string isbnCode;
while (getline(fin, isbnCode))
listOfIsbn.push_back(isbnCode);
}
此代码不正确
string isbnCodeReform = "";
for (i = 0; i < isbnCode.length(); itr++)
{
if(isalnum(isbnCode[i]))
{
isbnCodeReform[i] = isbnCode[i];
}
}
因为isbnCodeReform是一个零长度字符串,所以isbnCodeReform[i]
将失败。也许你是这个意思
string isbnCodeReform = "";
for (i = 0; i < isbnCode.length(); itr++)
{
if(isalnum(isbnCode[i]))
{
isbnCodeReform.push_back(isbnCode[i]);
}
}
相同的错误
vector<int> products;
for (i = 0; i < (isbnCodeReform.length() - 1); itr++)
{
if(isbnCodeReform[i] == 'X')
{
isbnCodeReform[i] = 10;
}
products[i] = isbnCodeReform[i] * (10 - i);
}
product又是一个零长度数组,因此products[i]
将失败。你可能想说的是
products.push_back(isbnCodeReform[i] * (10 - i));
这是关于迭代器如何工作的混淆
for (itr = products.begin(); itr != products.end(); itr++)
{
sumOfProducts += products[*itr];
}
你可以写
for (itr = products.begin(); itr != products.end(); itr++)
{
sumOfProducts += *itr;
}
或者你可以写
for (i = 0; i < products.size(); i++)
{
sumOfProducts += products[i];
}
你所拥有的是两者的混合,这是行不通的。
这里出现错误:
isbnCode.append(reinterpret_cast<const char*>(ch));
您将字符(很可能是数字)转换为const char *
-因此我们拥有字符的值,用作指针。在任何具有内存访问检查的系统上,这几乎肯定会失败。
您应该将该字符添加到字符串中。最简单的方法是:
isbnCode += ch;
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 合并排序:分段错误核心转储
- C++:分段错误(核心转储)
- 从 pybind11 构建导入模块时出现"分段错误(核心转储)"
- 如何使用 lldb 在曼扎罗中调试 lz4 文件格式的核心转储?
- qt C++命令行代码中的分段错误(核心转储)
- 从文件中读取的数据,但发生核心转储错误
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- C++ atof - 分段错误(核心转储)
- Linux C 只禁止我的程序使用核心转储
- 为什么我的代码包含错误分段错误(核心转储)?