CS50 Speller加载字典时while循环未执行问题求助
解决CS50 Speller中load函数while循环未执行的问题
核心问题定位
你的代码里fscanf的格式字符串存在错误:while(fscanf(dict,"%s\n",word) != EOF)中的\n完全多余,这是导致循环根本不执行的直接原因。
原因解释
fscanf的%s格式符本身会自动跳过所有前导空白字符(包括换行、空格、制表符),随后读取连续的非空白字符直到下一个空白,完全适配字典文件每行一个单词的格式。而你额外添加的\n会让fscanf在读取完单词后,持续等待并跳过所有空白字符,直到遇到非空白字符才会完成本次调用——如果字典文件结尾无多余字符,或文件本身内容异常,这个逻辑会直接让fscanf返回EOF,循环根本无法启动。
解决方案
- 修正
fscanf的格式字符串,删除末尾的\n:
while(fscanf(dict,"%s",word) != EOF)
- 额外验证步骤(可选):
- 确认
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
相关产品推荐
相关产品推荐

