CS50 Python塔可店任务:EOF输入导致程序退出码异常求助
CS50 Python塔可店任务:EOF处理修复与check50报错解决
问题情况
正在完成哈佛大学CS50 Python课程的塔可店任务,程序基本能正常处理输入,但check50检测时报错:
:( input of EOF halts program Cause expected exit code 0, not 1
同时在GitHub的VS Code环境中,无法通过ctrl+z或ctrl+d触发EOFError,没法测试异常处理逻辑。
原代码如下:
menu = { "Baja Taco": 4.00, "Burrito": 7.50, "Bowl": 8.50, "Nachos": 11.00, "Quesadilla": 8.50, "Super Burrito": 8.50, "Super Quesadilla": 9.50, "Taco": 3.00, "Tortilla Salad": 8.00 } def main(): item = get_dish("Item: ") total = 0 try: while True: try: total += menu[item.title()] print("$" + str(round(total, 3))) item = get_dish("Item: ") except KeyError: item = get_dish("Item: ") pass except EOFError: pass def get_dish(prompt): dish = input(prompt) while dish.lower() in menu == False: dish = input(prompt) else: return dish main()
代码问题分析
- get_dish函数判断逻辑错误:
dish.lower() in menu永远为False,因为menu的键是首字母大写格式(比如"Baja Taco"),全小写字符串无法匹配,导致循环无限要求输入,无法正确返回有效内容。 - EOFError未被完整捕获:
main函数中第一次调用get_dish("Item: ")在外层try块之外,触发EOF时,这个位置的input()会直接抛出EOFError,无except块捕获,导致程序以非0状态退出,这就是check50报错的核心原因。
修复后的代码
menu = { "Baja Taco": 4.00, "Burrito": 7.50, "Bowl": 8.50, "Nachos": 11.00, "Quesadilla": 8.50, "Super Burrito": 8.50, "Super Quesadilla": 9.50, "Taco": 3.00, "Tortilla Salad": 8.00 } def main(): total = 0 try: while True: item = input("Item: ").title() if item in menu: total += menu[item] print(f"${total:.2f}") except EOFError: pass main()
修复说明
- 移除冗余的
get_dish函数,直接在循环内处理输入,简化代码层级 - 输入后直接转成
title()格式,与menu的键匹配,准确判断是否为有效菜品 - 将所有输入操作放在
try块内,确保EOFError能被捕获,程序正常退出(退出码0) - 使用格式化字符串
f"${total:.2f}"保证金额显示两位小数,符合任务输出要求
触发EOFError的测试方法
- 终端直接运行:
- Linux/macOS:运行程序后输入若干菜品,按
Ctrl+D触发EOF - Windows:运行程序后输入若干菜品,按
Ctrl+Z再按回车触发EOF
- Linux/macOS:运行程序后输入若干菜品,按
- 管道输入测试:
在终端执行命令,用echo传递输入内容,结束后自动触发EOF:echo -e "Taco\nBurrito" | python your_program.py - 文件重定向输入:
创建文本文件input.txt,每行写一个测试菜品,然后执行:
文件读取完毕后自动触发EOFpython your_program.py < input.txt
内容的提问来源于stack exchange,提问作者Mikołaj Przygoda
相关产品推荐
相关产品推荐

