Jas*_*ing 1 c++ memory coredump pointers segmentation-fault
我一直有这个问题已经有一段时间了,我已经搜索过这种类型的错误,我相信它与内存泄漏或指向什么都没有的指针有关.
我一遍又一遍地检查我的代码,我无法找到这个问题的确切位置,因为我不知道如何调试它.即使我尝试断开代码的第一行,它也会崩溃.
它正在从文件中读取一堆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";
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!
我试图详细说明尽可能多的明显错误.还有更多.有了这么多错误,显然你采用了错误的编程方法.首先,你应该清楚地思考你正在编写的代码,编写看起来大致正确的东西是不够的,通过编程你必须完全正确.其次,你写的是太多低质量的代码.您应该编写几行代码,在编写代码之前先完成这些代码.你在错误时堆积了错误,所以很明显你一直在进行零测试.即使是专业人士也无法工作,更不用说初学者了.工作意味着工作,而不仅仅是编译.正如此代码所示,编写大量编译代码很容易.最后学习使用调试器,它将有助于加载.显然你有一些复杂的客户端/服务器设置.忘掉这一点,在自己的机器上安装编译器和调试器.
isbnCode.append(reinterpret_cast<const char*>(ch));
Run Code Online (Sandbox Code Playgroud)
是错的
isbnCode += ch;
Run Code Online (Sandbox Code Playgroud)
是你想要的.除非你真的知道自己在做什么,否则不要使用reinterpret_cast.
while (!fin.eof())
{
fin.get(ch);
Run Code Online (Sandbox Code Playgroud)
是检查文件结尾的错误方法
while (fin.get(ch))
{
Run Code Online (Sandbox Code Playgroud)
是你想要的.
实际上整体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);
}
Run Code Online (Sandbox Code Playgroud)
此代码不正确
string isbnCodeReform = "";
for (i = 0; i < isbnCode.length(); itr++)
{
if(isalnum(isbnCode[i]))
{
isbnCodeReform[i] = isbnCode[i];
}
}
Run Code Online (Sandbox Code Playgroud)
因为isbnCodeReform是一个零长度字符串所以isbnCodeReform[i]会失败.可能你的意思是这个
string isbnCodeReform = "";
for (i = 0; i < isbnCode.length(); itr++)
{
if(isalnum(isbnCode[i]))
{
isbnCodeReform.push_back(isbnCode[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是同样的错误
vector<int> products;
for (i = 0; i < (isbnCodeReform.length() - 1); itr++)
{
if(isbnCodeReform[i] == 'X')
{
isbnCodeReform[i] = 10;
}
products[i] = isbnCodeReform[i] * (10 - i);
}
Run Code Online (Sandbox Code Playgroud)
产品再次是零长度数组,因此products[i]将失败.你可能意味着类似的东西
products.push_back(isbnCodeReform[i] * (10 - i));
Run Code Online (Sandbox Code Playgroud)
这是关于迭代器如何工作的混淆
for (itr = products.begin(); itr != products.end(); itr++)
{
sumOfProducts += products[*itr];
}
Run Code Online (Sandbox Code Playgroud)
你可以写
for (itr = products.begin(); itr != products.end(); itr++)
{
sumOfProducts += *itr;
}
Run Code Online (Sandbox Code Playgroud)
或者你可以写
for (i = 0; i < products.size(); i++)
{
sumOfProducts += products[i];
}
Run Code Online (Sandbox Code Playgroud)
你所拥有的是两者的混合,它们不起作用.