Ошибка отладки

Я пытаюсь создать свой собственный хэш-класс для школьного задания, но, пройдя часть пути, я застрял в ошибке, которую я не смог отладить.

Когда я запускаю свой проект, я получаю «Отладочное утверждение не удалось! … Выражение: недопустимый нулевой указатель».

Программа выдает эту ошибку в строке 16 в моем файле драйвера (test.cpp). Мне кажется, что указатель на мой класс не NULL,

Буду очень признателен за любую помощь относительно того, что вызывает эту ошибку и как я могу ее исправить.

//Hash.h

#include <string>
struct Student
{
std::string name;
std::string id;
};

class MyHash{
public:
MyHash();
int hashCode(int, int);
void insertItemCollision(std::string, std::string);
Student retrieveItem(std::string);
Student students[100];
};

//Hash.cpp
#include <iostream>
#include "Hash.h"

MyHash::MyHash()
{
for(int i = 0; i < 100; i++)
{
students[i].id.assign(NULL);
students[i].name.assign(NULL);
}
}int MyHash::hashCode(int id, int max)
{

return (id % max);
}

void MyHash::insertItemCollision(std::string id, std::string name)
{
int idInt = atoi(id.c_str());
int location;location = hashCode(idInt, 100);
while (students[location].id != "")
location = (location + 1) % 100;
students[location].id = id;
students[location].name = name;
}Student MyHash::retrieveItem(std::string id)
{
int location;
int startLoc;
int idInt = atoi(id.c_str());
bool moreToSearch = true;
bool found;
Student item;

startLoc = hashCode(idInt, 100);
location = startLoc;
do
{
if (students[location].id == id || students[location].id == "")
moreToSearch = false;
else
location = (location + 1) % 100;
} while (location != startLoc && moreToSearch);
found = (students[location].id == id);
if (found)
item = students[location];
return item;
}//test.cpp
#include <iostream>
#include<string>
#include<fstream>
#include "Hash.h"using namespace std;int read(string[]);
void splitString(string, Student&);
void init(string[], Student[], int);

int main()
{
int size;
string input[100];
MyHash* h = new MyHash();
size = read(input);
init(input, h->students, size);

system("pause");
return 0;
}

int read(string st[])
{
int size = 0;
ifstream infilestream;
infilestream.open("test.txt");for(int i = 0; infilestream.good(); i++)
{
getline(infilestream, st[i]);
cout<<st[i] <<endl;
size++;
}
infilestream.close();
return size;
}

void splitString(string record, Student& s)
{
s.id = record.substr(0, 4);
s.name = record.substr(5, record.length());
}

void init(string inputs[], Student stus[], int size)
{
for(int i = 0;i < size; i++)
{
splitString(inputs[i],stus[i]);
cout << stus[i].name << " " << stus[i].id << endl;
}
}

//test.txt
9892 Zack Lewis
4592 Ken Rodriguez
9819 Anderson Clark
1519 Ben Robinson
4597 Abigail Martinez
8542 Madison Garcia
6113 Mia Thompson
8591 Chloe Martin
9491 Daniel Harris
1698 Aiden White
5984 Alexander Walker
6541 Ethan Jackson
9549 Michael Thomas
5949 Emily Anderson
9861 Ava Taylor
5412 Noah Moore
6262 Olivia Wilson
1954 Jayden Miller
4954 William Davis
9567 Emma Brown
5195 Mason Jones
9195 Isabella Williams
5199 Sophia Johnson
1294 Jacob Smith

2

Решение

это

MyHash::MyHash()
{
for(int i = 0; i < 100; i++)
{
students[i].id.assign(NULL);
students[i].name.assign(NULL);
}
}

это неверно. Это правильно

MyHash::MyHash()
{
}

Вам не нужно присваивать NULL std::string, Конструктор по умолчанию для std::string автоматически создает пустую строку. Фактически, присвоение NULL std :: string является ошибкой, поскольку этот метод всегда ожидает указатель на строку C.

На самом деле вам не нужно MyHash конструктор вообще, потому что по умолчанию все делает то, что вы пытались сделать в написанной вами версии. Вы видите, что C ++ проще, чем вы думаете.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]