我试图实现一个存储英语单词的哈希表。简而言之,我使用了一系列链表(链接),我还没有完成整个程序,但只是实现了它需要一个单词输入并通过它搜索它哈希表,但它开始给我分段错误。请帮帮我这个...... 提前谢谢!
strcpy(new->s,val);
这就是我遇到分段错误的原因。
我的整个代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
typedef struct node
{
string s;
struct node *next;
}node;
node* create(char*);
unsigned long sdbm(unsigned char*);
bool search(string s,node *first)
{
node *ptr=first;
bool found=false;
while(ptr->next!=NULL)
{
if(strcmp(ptr->s,s)==0)
{
found=true;
break;
}
}
if(found==true)
return true;
else
return false;
}
int main(void)
{
node a[26];
printf("Enter the string\n");
string s=get_string();
unsigned long hashcode = sdbm((unsigned char*)s);
printf("The hashcode is %lu\n", hashcode);
a[hashcode].next=create(s);
printf("Enter the string to be searched among the ones you recently typed
in\n");
string t=get_string();
if(search(t,&a[sdbm((unsigned char*)t)]) == true)
printf("found\n");
else
printf("not found\n");
}
node* create(string val)
{
node* new = malloc(sizeof(node));
if(new!=NULL)
{
new->s="";
strcpy(new->s,val); // this is the part ehere I get Segmentation Fault
new->next=NULL;
}
return new;
}
unsigned long
sdbm(unsigned char *str)
{
unsigned long hash = 0;
int c;
while ((c = *str++)!=0)
hash = c + (hash << 6) + (hash << 16) - hash;
return hash%26;
}
答案 0 :(得分:0)
在这里,您使用的是不是标准c头文件的头文件cs50.h
。您可能知道在该头文件中有一行#define unsigned char* string
,即此处string
不是c++ string
表示char*
。因此,无论何时使用string
,都会将其解释为char*
。在create
函数的代码中存在错误
node* create(string val)
{
node* new = malloc(sizeof(node));
if(new!=NULL)
{
new->s=""; //ERROR Here
strcpy(new->s,val); // this is the part ehere I get Segmentation Fault
new->next=NULL;
}
return new;
}
您为[{1}}分配了new
类型的空间,但是您没有为node
分配空间new->s
,因此当您复制字符串时它正在解决分段错误。
你的代码应该是这样的:
pointer to char