CS50 Pset4 Adieu任务:本地运行正常但check50检测失败求助
问题分析与代码修正
你的代码在本地测试看似正常,但check50未通过,核心问题在于多名字场景下的格式细节错误,以及逻辑处理不够严谨。以下是具体问题和修正方案:
原代码存在的问题
- 3个及以上名字时格式错误:当输入3个或更多名字时,倒数第二个名字与
and之间缺少逗号。比如输入Liesl、Friedrich、Louisa,原代码会输出Adieu, adieu, to Liesl, Friedrich and Louisa,而正确格式应为Adieu, adieu, to Liesl, Friedrich, and Louisa。 - 不必要的列表反转:反转列表增加了代码复杂度,完全可以通过索引直接访问首尾元素。
- 异常捕获的误用:用捕获
IndexError来处理单个名字的场景,属于将正常逻辑分支当作异常处理,代码可读性和可靠性差。
修正后的代码
names = [] while True: try: name = input("Name: ") names.append(name) except EOFError: print() break # 根据名字数量处理输出格式 output_prefix = "Adieu, adieu, to " if len(names) == 1: print(f"{output_prefix}{names[0]}") elif len(names) == 2: print(f"{output_prefix}{names[0]} and {names[1]}") else: # 拼接前n-1个名字,最后添加", and 最后一个名字" first_part = ", ".join(names[:-1]) print(f"{output_prefix}{first_part}, and {names[-1]}")
代码说明
- 输入处理:仅捕获
EOFError(按下Control-D触发),无需捕获ValueError,因为input()不会因正常输入姓名抛出该异常。 - 格式分支:
- 单个名字:直接拼接输出。
- 两个名字:用
and连接两个名字,无额外逗号。 - 三个及以上名字:用
", ".join()拼接前n-1个名字,再在末尾添加", and 最后一个名字",完全符合要求格式。
内容的提问来源于stack exchange,提问作者Midget Codes
相关产品推荐
相关产品推荐

