// Loads dictionary into memory, returning true if successful, else false
bool load(const char *dictionary)
{
// TODO
FILE* dict = fopen(dictionary,"r");
if (dict == NULL)
{
return false;
}
//initialize table
for (int i = 0; i < N; i++)
{
table[i] = NULL;
}
//char array
char word[LENGTH + 1];
//read from file
while(fscanf(dict,"%sn",word) != EOF)
{
node *new_node = malloc(sizeof(node));
/* so we know where the end of the linked list is */
new_node->next = NULL;
if(new_node == NULL)
{
printf("Couldn't malloc new noden");
fclose(dict);
return false;
}
/*hash table*/
strcpy(new_node->word , word);
hash_value = hash(word);
if(table[hash_value] == NULL)
{
table[hash_value] = new_node;
}else
{
new_node -> next = table[hash_value];
table[hash_value] = new_node;
}
word_count++;
}
fclose(dict);
return true;
}
我什么都试过了,可就是找不出毛病来。我是否错误地分配了我的文件,或者我的fscanf实现错误?我试着调试debugg50,我发现我的while循环根本没有执行。
有几个问题…
- 不要使用
fscanf
(也不要与EOF
比较) cs50
字典文件每行只有一个字。- 先用
fgets
,再用strcspn
去掉换行符 - 在检查
NULL
之前,您正在解引用 - 如果你的
hash
函数不使用% N
,你应该在调用者中做。 - 您的
table
设置逻辑可以简化。不需要为table[hash_value]
设置
new_node
(与new_node->next = NULL;
)NULL
值有关其他帮助,请参阅我的cs50拼写答案:cs50 pset5拼写优化
下面是清理后的代码:// Loads dictionary into memory, returning true if successful, else false
bool
load(const char *dictionary)
{
// TODO
FILE *dict = fopen(dictionary, "r");
if (dict == NULL) {
return false;
}
//initialize table
for (int i = 0; i < N; i++) {
table[i] = NULL;
}
//char array
char word[LENGTH + 1];
//read from file
while (fgets(word,sizeof(word),dict) != NULL) {
// strip newline
word[strcspn(word,"n")] = 0;
if (new_node == NULL) {
printf("Couldn't malloc new noden");
fclose(dict);
return false;
}
// copy value into node
strcpy(new_node->word, word);
// compute the hash
hash_value = hash(word);
hash_value %= N;
new_node->next = table[hash_value];
table[hash_value] = new_node;
word_count++;
}
fclose(dict);
return true;
}