首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试断言失败

调试断言失败
EN

Stack Overflow用户
提问于 2012-11-10 05:01:38
回答 1查看 146关注 0票数 2

我正在尝试为一项学校作业创建自己的散列类,但在完成了部分过程后,我被一个我无法调试的错误所困扰。

当我运行我的项目时,我得到一个“调试断言失败!...Expression:无效的空指针。”

程序在我的驱动文件(test.cpp)的第16行给出了这个错误。在我看来,指向我的类的指针不是NULL

任何关于这个错误的原因以及我如何修复它的帮助都将不胜感激。

代码语言:javascript
复制
//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
EN

Stack Overflow用户

回答已采纳

发布于 2012-11-10 05:03:41

代码语言:javascript
复制
MyHash::MyHash()
{
    for(int i = 0; i < 100; i++)
    {
        students[i].id.assign(NULL);    
        students[i].name.assign(NULL);
    }
}

是不正确的。这是正确的

代码语言:javascript
复制
MyHash::MyHash()
{
}

您不必将NULL赋值给std::stringstd::string的默认构造函数会自动创建一个空字符串。实际上,将NULL赋值给std::string是错误的,因为这个方法总是需要一个指向C字符串的指针。

实际上,您根本不需要MyHash构造函数,因为默认构造函数会执行您在编写的版本中尝试执行的所有操作。你看,C++比你想象的要简单。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13315969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档