我一直有這個問題一段時間了,我已經搜索了這種類型的錯誤,我相信它必須處理內存泄漏或指向什麼都沒有的指針。C++分割錯誤 - 核心轉儲
我一遍又一遍地檢查了我的代碼,我無法準確找到問題發生的位置,因爲我不知道如何調試它。即使我嘗試斷點代碼的第一行,它也會崩潰。
它從文件中讀取一堆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";
}
}
任何幫助,將不勝感激!
您需要一個調試器來提取堆棧跟蹤,以便知道它在哪裏崩潰。你在做什麼平臺? GCC? MSVC? – 2013-05-04 14:39:38
因此,所有這些代碼甚至不是原始的段錯誤吧?當然會很好的將其縮小到某種特定的方法。 – 2013-05-04 14:40:16
我從來不知道valgrind,現在嘗試,謝謝 – 2013-05-04 14:41:03