You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 plates.py程序bug:输入50被误判为有效(应为无效)

问题分析

你的代码遗漏了规则1的核心校验:所有车牌必须以至少两个字母开头。当输入“50”时,代码仅检查了长度符合要求、全数字属于合法字符,随后进入数字逻辑判断——因为第一个数字不是0且后续都是数字,就返回了True,但完全没校验前两位是否为字母,导致误判。

修复后的代码
def main():
    plate = input("Plate: ")
    if is_valid(plate):
        print("Valid")
    else:
        print("Invalid")

def is_valid(s):
    # 规则2:长度限制在2-6位;规则4:仅允许字母和数字
    if not (2 <= len(s) <= 6 and s.isalnum()):
        return False
    
    # 规则1:强制校验前两个字符必须是字母
    if not (s[0].isalpha() and s[1].isalpha()):
        return False
    
    # 定位第一个数字的位置
    first_num_index = None
    for idx, c in enumerate(s):
        if c.isdigit():
            first_num_index = idx
            break
    
    # 全字母的情况直接判定有效
    if first_num_index is None:
        return True
    
    # 规则3:第一个数字不能是0
    if s[first_num_index] == '0':
        return False
    
    # 规则3:数字必须全部在末尾,不能有字母穿插在数字之后
    for c in s[first_num_index:]:
        if not c.isdigit():
            return False
    
    return True
关键改动说明
  • 新增前两位字符的字母校验:这是规则1的核心要求,放在最前面可以快速过滤“50”这类不符合基础要求的输入。
  • 调整逻辑顺序:先校验长度、字符合法性、前两位字母这些基础规则,再处理数字相关的细节规则,让代码逻辑更清晰,避免遗漏核心校验点。
  • 优化数字索引获取:用enumerate直接拿到第一个数字的索引,比原代码先找字符再调用index更高效,也避免了重复遍历字符串。

内容的提问来源于stack exchange,提问作者Mounika Bandla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:42:26