CS50 Python作业numb3rs问题:check50报错exit code不符求助
CS50 numb3rs作业问题排查与解决
核心问题分析
你遇到的check50错误本质是两个问题:
- 退出码逻辑颠倒:合法IPv4返回了1而非0
- 程序异常崩溃:部分测试用例触发了未捕获的异常,导致测试无法执行
常见错误点与修正方案
1. 退出码逻辑搞反
检查main函数的判断逻辑,CS50要求:
- 输入合法IPv4时,程序退出码为
0 - 输入不合法/参数错误时,退出码为
1
错误示例:
# 错误:合法时退出码1,不合法时0 if validate(ip): sys.exit(1) else: sys.exit(0)
修正后的main函数:
import sys def main(): # 检查命令行参数数量是否为1 if len(sys.argv) != 2: sys.exit(1) ip = sys.argv[1] if validate(ip): sys.exit(0) else: sys.exit(1)
2. validate函数未处理异常场景
如果validate没有处理非数字段、空段、段数不对等情况,会触发ValueError或索引错误,导致程序崩溃,check50无法完成测试。
正确的validate函数实现:
def validate(ip): # 按点分割IP段 parts = ip.split('.') # 必须正好4段 if len(parts) != 4: return False for part in parts: # 检查是否为纯数字(排除空字符串、字母、负号) if not part.isdigit(): return False num = int(part) # 检查数值范围0-255 if num < 0 or num > 255: return False return True
3. 测试用例覆盖不全
确保test_numb3rs.py覆盖所有边界场景:
from numb3rs import validate def test_validate(): # 合法IP assert validate("1.2.3.4") == True assert validate("255.255.255.255") == True assert validate("0.0.0.0") == True # 段数错误 assert validate("1.2.3") == False assert validate("1.2.3.4.5") == False # 非数字段 assert validate("1.a.3.4") == False assert validate("1..3.4") == False # 数值超出范围 assert validate("256.1.1.1") == False assert validate("-1.2.3.4") == False
验证步骤
- 先运行本地测试:
pytest test_numb3rs.py -v,确保所有测试通过 - 手动验证命令行退出码:
- 合法IP:
python numb3rs.py 1.1.1.1,执行后输入echo $?(Linux/macOS)或echo %errorlevel%(Windows),应返回0 - 非法IP:
python numb3rs.py 256.1.1.1,应返回1 - 参数错误:
python numb3rs.py(无参数)或python numb3rs.py 1.1.1.1 2.2.2.2(多参数),应返回1
- 合法IP:
完成以上修正后,再运行check50即可通过所有测试。
内容的提问来源于stack exchange,提问作者WalkedCreator65
相关产品推荐
相关产品推荐

