PSET 5 Speller.c运行check50返回退出码2而非0的编译报错问题
CS50 PSET5 Speller 提交退出码2报错排查方案
问题描述
完成CS50 PSET5的speller任务时,运行check50/submit50提交检测收到报错,提示预期退出码为0,实际返回退出码2;尝试重置dictionary.h、speller.c等程序原生文件后,问题仍然存在。
检测输出完整错误信息如下:
:) dictionary.c exists :( speller compiles expected exit code 0, not 2 :| handles most basic words properly can't check until a frown turns upside down
核心报错逻辑
这个报错的本质是编译阶段失败,check50返回退出码2代表代码未完成编译,后续所有功能检测项都不会运行,因此不需要优先排查拼写检查的运行时逻辑,先解决编译问题即可。
排查解决步骤
- 本地手动编译定位具体错误
不要只依赖check50的模糊报错,进入speller所在的工作目录,直接在终端执行make speller命令,终端会直接输出具体的编译错误位置、错误类型,绝大多数问题可以通过这一步直接定位。 - 检查dictionary.c的常见编译错误
- 确认要求实现的5个函数(
check、hash、load、size、unload)的返回值类型、参数列表和dictionary.h中的声明完全一致,不要随意修改参数类型、返回值类型,比如不要把返回bool类型的函数写成返回int或者void。 - 排查基础语法错误:检查所有语句末尾是否漏写分号、大括号是否成对闭合、是否使用了未声明的变量、引入的头文件是否齐全——使用
malloc/free需要引入<stdlib.h>,使用字符串处理函数需要引入<string.h>,使用文件操作函数需要引入<stdio.h>,使用bool类型需要确保引入了<stdbool.h>或cs50的头文件。 - 确认dictionary.c中没有自定义
main函数,main函数仅在speller.c中存在,重复定义main函数会直接触发编译失败。
- 确认要求实现的5个函数(
- 校验目录文件完整性
确认工作目录下dictionary.c、dictionary.h、speller.c、Makefile四个核心文件齐全,不要把文件存放到子目录中;如果之前重置过原生文件,确认使用的是当前对应CS50版本的原生文件,不要混用旧版课程或其他任务的同名文件。 - 清理缓存重试
执行make clean命令删除历史编译生成的.o目标文件、旧的可执行文件,重新执行make speller,确认本地编译无报错后,再重新运行check50提交检测。
注:只要本地
make speller可以正常生成可执行文件,退出码2的编译报错就会自动消失,后续功能检测项才会正常执行,否则所有功能项都会停留在待检测状态。
内容的提问来源于stack exchange,提问作者gameloft
相关产品推荐
相关产品推荐

