CS50 Speller加载函数异常:无法完整加载字典求助
字典加载函数的问题排查
你的load函数核心问题出在do-while循环的逻辑错误,导致字典无法完整加载且误判单词数量增加:
- do-while循环会先执行循环体,再判断终止条件。第一次执行时,你直接调用
fscanf(file, "%s", word)却没有检查返回值,哪怕读取失败(比如文件为空、读到EOF),依然会执行后续的节点创建、插入哈希表、dcount自增操作,这会把无效内容(比如word数组的残留值)插入哈希表,同时让dcount多统计一个不存在的单词。 - 循环末尾再次调用的
fscanf,当它返回EOF时循环终止,但此时上一次循环体已经处理了一次失败的读取,这就导致了多余的无效节点被加入。
修正后的代码:
bool load(const char *dictionary) { FILE *file = fopen(dictionary, "r"); if (file == NULL) { return false; } char word[LENGTH + 1]; // 改用while循环,先读取再判断是否处理 while (fscanf(file, "%s", word) != EOF) { node *w = malloc(sizeof(node)); if (w == NULL) { // 补充关闭文件,避免资源泄漏 fclose(file); return false; } strcpy(w->word, word); w->next = NULL; unsigned int hashno = hash(w->word); w->next = table[hashno]; table[hashno] = w; dcount++; } fclose(file); return true; }
补充:原代码存在内存泄漏风险——当malloc失败时直接return false但未关闭文件,修正后的代码补充了文件关闭操作。
内容的提问来源于stack exchange,提问作者Sherif Gamal
相关产品推荐
相关产品推荐

