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
相关产品推荐
相关产品推荐

