CS50p - PSet4 - 再见 - 退出代码 1

问题描述 投票:0回答:1

所以,我应该已经完成了问题集 4 中 Adieu 练习的代码。我测试了 check50 使用的所有输入,并从我的代码中获得了正确的反馈。但是,当我运行 check50 时,它会抛出“:( EOF 停止程序的输入;预期退出代码 0,而不是 1”,据我了解,这意味着代码未正确编译。之后,它无法检查所有内容以下场景,尽管如果代码未编译则有意义。

from icecream import ic
import sys

def main():
    names = []
    txt = "Adieu, adieu, to"
    while True:
        try: names.append(input())
        except EOFError:
            for i in range(len(names)):
                if i == 0: txt = txt + " " + names[i]
                elif i == len(names)-1: txt = txt + " and " + names[i]
                else: txt = txt + ", " + names[i]
                print(txt)
            break

main()

忽略 ic 和 sys 导入,我只是用它们来测试代码,但在导入它们之前就失败了,所以它与问题无关。我记得在这之前的几个版本的代码我没有遇到这个问题,尽管我不记得当时和现在之间发生了什么(当时代码不起作用,否则我就不会碰它)

我在语法、嵌套和运行顺序上做了很多改变,但似乎没有什么能让 check50 喜欢它。

python compiler-errors compilation cs50
1个回答
0
投票

找到了问题,但我的推理可能不正确: 退出代码 1 表示执行异常终止,这可能隐藏了运行时错误。我环顾了一下我的代码,发现尽管我测试了它并且没有收到错误,但这里可能隐藏着一个运行时错误:

while True:
    try: names.append(input())
    except EOFError: break

如果用户使用 ctrl+d 退出,输入函数会提前结束,这意味着附加操作要么无法正常工作,要么只是不向列表附加任何内容。因此,当我稍后调用

names[i]
时,它没有什么可调用的,因为列表是空的。

我添加了一个

sys.exit()
,它在列表为空时运行,以防止它运行以下几行。最后看起来像这样:

import sys

def main():
    names = []
    txt = "Adieu, adieu, to"
    while True:
        try: names.append(input())
        except EOFError: break
    if len(names) == 0: sys.exit()
    for i in range(len(names)):
        if i == 0: txt = txt + " " + names[i]
        elif i == len(names)-1: txt = txt + " and " + names[i]
        else: txt = txt + ", " + names[i]
    print(txt)

if __name__ == "__main__": main()

正如我所说,这有效,但我不确定我的分析是否正确,所以欢迎任何更正。

© www.soinside.com 2019 - 2024. All rights reserved.