我正在做CS50x2022的习题集5:拼写。经过一段时间后,我终于设法使我的代码"正常工作"。check
函数在开始时确实工作,但在发现一些拼写错误的单词后,它就停止了。Debug50显示错误"未知停止事件"。它的来源是什么?
bool check(const char *word)
{
node *cursor = malloc(sizeof(node));
int hash_word = hash(word);
cursor->next = table[hash_word]->next;
while (cursor->next != NULL)
{
if (strcasecmp(word, cursor->next->word) == 0)
{
return true;
}
else
{
cursor = cursor->next;
}
}
free(cursor);
return false;
}
这是我的加载函数,因为可能有问题的来源?但正如我所检查的,它从字典中加载了每个单词,但这里是。
// Loads dictionary into memory, returning true if successful, else false
bool load(const char *dictionary)
{
for (int z = 0; z < N; z++)
{
table[z] = malloc(sizeof(node));
table[z]->next = NULL;
}
FILE *file = fopen(dictionary, "r");
if (file == NULL)
{
return 1;
}
for (int i = 0; i < 143091; i++) //143091
{
number_of_words = number_of_words + 1;
char word[LENGTH + 1];
fscanf(file, "%s", word);
node *n = malloc(sizeof(node));
if (n == NULL)
{
return 1;
}
strcpy(n->word, word);
int number = hash(n->word);
n->next = table[number]->next;
table[number]->next = n;
}
fclose(file);
return true;
}
没有理由让check
函数分配内存。它应该只迭代哈希表项所指向的列表。
此外,测试cursor
指向的每个条目,而不是cursor->next
。
修改后的版本:
bool check(const char *word) {
int hash_word = hash(word);
node *cursor = table[hash_word]
while (cursor != NULL) {
if (strcasecmp(word, cursor->word) == 0) {
return true;
}
cursor = cursor->next;
}
return false;
}
加载字典也不正确:
- 不为哈希表中的每个条目分配一个假节点,只是用空指针初始化数组。
- 不要对字数做假设。
- 执行
fscanf()
成功转换测试。 通过告诉 - 在错误的情况下返回
false
并关闭文件。
fscanf()
要存储到目标数组的最大字符数来避免潜在的缓冲区溢出。// Loads dictionary into memory, returning true if successful, else false
bool load(const char *dictionary) {
number_of_words = 0;
for (int z = 0; z < N; z++) {
table[z] = NULL;
}
FILE *file = fopen(dictionary, "r");
if (file == NULL) {
return false;
}
char word[64 + 1];
// read all words from the dictionary.
// no assumption on the number of words
while (fscanf(file, "%64s", word) == 1) {
node *n = malloc(sizeof(node));
if (n == NULL) {
fclose(file);
return false;
}
strcpy(n->word, word);
int key = hash(n->word);
n->next = table[key];
table[key] = n;
number_of_words += 1;
}
fclose(file);
return true;
}