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

CS50 Speller加载字典时while循环未执行问题求助

解决CS50 Speller中load函数while循环未执行的问题

核心问题定位

你的代码里fscanf的格式字符串存在错误:while(fscanf(dict,"%s\n",word) != EOF)中的\n完全多余,这是导致循环根本不执行的直接原因。

原因解释

fscanf的%s格式符本身会自动跳过所有前导空白字符(包括换行、空格、制表符),随后读取连续的非空白字符直到下一个空白,完全适配字典文件每行一个单词的格式。而你额外添加的\n会让fscanf在读取完单词后,持续等待并跳过所有空白字符,直到遇到非空白字符才会完成本次调用——如果字典文件结尾无多余字符,或文件本身内容异常,这个逻辑会直接让fscanf返回EOF,循环根本无法启动。

解决方案

  1. 修正fscanf的格式字符串,删除末尾的\n:
while(fscanf(dict,"%s",word) != EOF)
  1. 额外验证步骤(可选):
    • 确认dictionary参数传递的路径正确,比如CS50的字典文件通常位于./dictionaries/目录下,确保调用load时传入的路径无误。
    • 在fopen成功后,可添加测试代码验证文件是否可读:
      int c = fgetc(dict);
      if (c == EOF) {
          printf("文件为空或无法读取\n");
          fclose(dict);
          return false;
      }
      ungetc(c, dict); // 将读取的字符放回文件流,不影响后续读取
      

修正后的完整load函数代码

// Loads dictionary into memory, returning true if successful, else false
bool load(const char *dictionary)
{
    FILE* dict = fopen(dictionary,"r");

    if (dict == NULL)
    {
        return false;
    }

    // 可选:验证文件是否有内容
    int c = fgetc(dict);
    if (c == EOF) {
        printf("文件为空或无法读取\n");
        fclose(dict);
        return false;
    }
    ungetc(c, dict);

    // initialize table
    for (int i = 0; i < N; i++)
    {
        table[i] = NULL;
    }

    char word[LENGTH + 1];

    while(fscanf(dict,"%s",word) != EOF)
    {
        node *new_node = malloc(sizeof(node));
        new_node->next = NULL;

        if(new_node == NULL)
        {
            printf("Couldn't malloc new node\n");
            fclose(dict);
            return false;
        }

        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;
}

内容的提问来源于stack exchange,提问作者liam gordon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:25:20