我是新用户,指针有问题。
函数 add_word(* word_to_add)应采用c字符串并将其添加到相应的word_node链表中。但是,后续添加似乎会覆盖哈希表中所有节点的单词元素。我认为这种情况正在发生,因为我将每个节点的word元素设置为指向word_to_add的指针,而不是复制word_to_add的值。
#define HASH_TABLE_SIZE 10
static char **word_list;
struct word_node {
char* word;
struct word_node *next;
};
static struct word_node *word_hash_table[HASH_TABLE_SIZE];
static int hash(char *word) {
int ascii_char;
int key;
key = 0;
while (*word != '\0') {
ascii_char = tolower(*word);
key += ascii_char;
word++;
}
key %= HASH_TABLE_SIZE;
return key;
}
void ws_add_word(char *word_to_add)
{
int word_position;
word_position = hash(word_to_add);
if (word_hash_table[word_position] == NULL)
{
struct word_node* p;
p = malloc(sizeof(struct word_node));;
p->word = word_to_add;
p->next = NULL;
word_hash_table[word_position] = p;
++num_words;
} else {
struct word_node* p;
p = word_hash_table[word_position];
while (p->next != NULL)
{
p = p->next;
}
struct word_node* q;
q = malloc(sizeof(struct word_node));
q->word = word_to_add;
q->next = NULL;
p->next = q;
++num_words;
}
答案 0 :(得分:1)
我认为你的代码是正常的。如果您遇到问题,可能就是您如何调用该功能。例如,这是一个快速&肮脏的样本:
#include <stdio.h>
#include <stdlib.h>
int num_words;
/* paste sample code here */
#define HASH_TABLE_SIZE 10
// rest of code
void ws_add_word(char *word_to_add)
{
// function code
}
/* end of sample code */
int main (void)
{
char a[] = "Hello";
char b[] = "Helkp"; // chosen to have the same hash result
ws_add_word((char *)&a);
ws_add_word((char *)&b);
}
我使用gcc -g
进行了编译并浏览了gdb
。这样做并单步执行ws_add_word
并检查word_hash_table
的内容似乎就是你想做的。如果它仍然不起作用,您应该举例说明您如何调用ws_add_word
。
此外,如果您只是使用p->word = word_to_add
更改strcpy(p->word,word_to_add)
,则可能会出现段错误,因为p->word
尚未设置为有意义的任何内容。您需要p->word = (char *)malloc(N)
N
足够大,然后strcpy
,如果这是您真正想做的事情。是否需要取决于char *word_to_add
指向的内存位置在下次需要使用时是否有效。
答案 1 :(得分:0)
对我来说很好,除了ws_add_word中的第10行。
更改
q->word = word_to_add;
到
p->word = word_to_add;
答案 2 :(得分:0)
你不能只把两个字符串或字符指针等同于:
char* p1, p2;
p1=p2; // THIS IS INVALID
在您的代码中,您犯了两次错误: -
p->word = word_to_add;
和
q->word = word_to_add;
这表示你正在将p-&gt;字指向word_to_add这是一个指针。它将开始引用相同的对象,但不会复制你期望的字符串。 它不会将word_to_add的内容复制到q-&gt; word,您可以这样做。
您需要使用任何字符串复制功能复制字符串,例如:strcpy,strncpy或memcpy。
用
替换p-&gt; word = word_to_addstrcpy(p->word,word_to_add);
和类似的
用
替换q-&gt; word = word_to_addstrcpy(q->word,word_to_add);
-
氪。阿洛克
答案 3 :(得分:0)
节点的char指针'word'似乎指向原始字符串,而不是持有自己的副本。只要原始字符串不变,这就没问题。例如:
//Assume word_to_add is "String 1"
p->word = word_to_add;
//Now change word_to_add to "String 2"
//After this p->word would be "String 2"
我不知道这是不是预期的行为。您可能希望为节点结构中的每个“单词”指针分配内存,并复制word_to_add字符串。