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

CS50 Pset6 Credit程序Python运行报IndexError字符串索引越界错误如何解决

错误原因排查

1. IndexError的直接诱因

Python中字符串索引从0开始计数,长度为N的字符串,合法索引范围是0 ~ N-1。你的循环写为for i in range(Numlen, -1, -1),第一次循环取的i值就是Numlen,超出了字符串最大索引Numlen-1,因此触发索引越界错误。
修正方法:将循环起始值改为Numlen-1,即:

for i in range(Numlen-1, -1, -1):

2. 你修改代码未生效的原因

strNumber[i]取到的是字符串类型的单个数字字符,直接执行strNumber[i] * 2是字符串重复操作,比如字符"3"乘2会得到"33",再转int得到的是33而不是你预期的6。正确写法是先转整数再做乘法:

doubleCheck = int(strNumber[i]) * 2

3. 其余潜在错误

  • 字符串不能直接和整数相加:secondSum = secondSum + strNumber[i]需要把字符转整数后再累加,改为secondSum += int(strNumber[i])
  • 卡号开头判断逻辑错误:strNumber[0]是字符串类型,和整数3/4/5比较永远为False,要改为和字符串比较,比如strNumber[0] == "3"
  • 整数除法错误:拆分两位数的时候doubleCheck / 10会得到浮点数,要改为整数除法doubleCheck // 10
  • 缺少卡号不匹配的兜底逻辑:如果校验和通过,但卡号开头和长度不符合AMEX/VISA/万事达规则,需要输出INVALID

修正后完整代码

from cs50 import get_int 
import sys

ccNumber = get_int("Number: ")
strNumber = str(ccNumber)
Numlen = len(strNumber)

if Numlen not in (13,15,16):
    sys.exit("INVALID")

firstSum = 0
secondSum = 0
doubleCheck = 0

for i in range(Numlen-1, -1, -1):
    digit = int(strNumber[i])
    if i % 2 == 0:
        secondSum += digit
    else:
        doubleCheck = digit * 2
        if doubleCheck >= 10:
            firstSum += (doubleCheck % 10)
            firstSum += (doubleCheck // 10)
        else:
            firstSum += doubleCheck

totalChecksum = firstSum + secondSum
valid = False

if totalChecksum % 10 == 0:
    if strNumber[0] == "3" and Numlen == 15:
        if strNumber[1] in ("4","7"):
            print("AMEX")
            valid = True
    elif strNumber[0] == "4" and Numlen in (13,16):
        print("VISA")
        valid = True
    elif strNumber[0] == "5" and Numlen == 16:
        if strNumber[1] in ("1","2","4","5"):
            print("MASTERCARD")
            valid = True

if not valid:
    print("INVALID")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:03:02