You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:50:57