鱼C论坛

 找回密码
 立即注册
查看: 1931|回复: 8

[已解决]出现错误IndexError: string index out of range

[复制链接]
发表于 2020-10-6 17:20:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
系统提示的信息为:
        Traceback (most recent call last):
          File "。。。。。。。。009密码星号.py", line 16, in <module>
            if (password[i] == '*') and (i < len(password)):
        IndexError: string index out of range

其中:password为用户输入密码(字符串)
        i为数字,用于循环
与小甲鱼老师的程序做对比之后,感觉问题出现在  password[i] == '*'  这一句
希望能够解答password[i] == '*'这一句,通过查询password中第0个到字符结束中是否包含*字符为啥行不通。
十分感谢

原始程序如下:
print('请输入密码:',end = '')
password = input()
code_len = len(password)

while times:
    if password == code:
        print('密码正确')
        break
    else: 
        while i <= code_len:
            if (password[i] == '*') and (i < len(password)):
                print('密码不能包含有‘*’!您还有',end = '')
                print(times ,end ='')
                print('次机会!请输入密码:',end = '')
                password = input()
                i = 0
            elif i == len(password):
                times -= 1
                if times == 0:
                    print('密码错误,次数已用完,账户锁定')
                    break
                i = 0
                print('密码输入错误!您还有' ,end = '')
                print(times ,end = '')
                print('次机会!请输入密码:' ,end = '')
                password = input()
                break
            else:
                i += 1

小甲鱼老师的程序如下
count = 3
password = 'FishC.com'

while count:
    passwd = input('请输入密码:')
    if passwd == password:
        print('密码正确,进入程序......')
        break
    elif '*' in passwd:
        print('密码中不能含有"*"号!您还有', count, '次机会!', end=' ')
        continue
    else:
        print('密码输入错误!您还有', count-1, '次机会!', end=' ')    
    count -= 1
最佳答案
2020-10-6 18:20:19
小_进 发表于 2020-10-6 18:07
好的,我发现我没有复制完全部内容。  十分尴尬

先说这个报错,输入的字符长度,始终是大于索引的,索引是从0开始的,所以你输入四位字符串,实际最大的索引是3,所以
        while i <= code_len-1:
这样就不报错了

然后下面的逻辑貌似也有问题,输错密码,没提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-6 17:26:21 | 显示全部楼层
你给的代码都运行不了,而且看报错提示,也和你的代码不一样。。。。。。你确定是这段代码的报错?

报错中: if (password == '*') and (i < len(password)):
代码中:if (password[i] == '*') and (i < len(password)):
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-6 17:52:14 | 显示全部楼层
疾风怪盗 发表于 2020-10-6 17:26
你给的代码都运行不了,而且看报错提示,也和你的代码不一样。。。。。。你确定是这段代码的报错?

报错 ...

感谢你的回答。
在提问中确实是因为某种因素,是输错了信息。
如下是程序的错误提示。
Traceback (most recent call last):
  File "D:\Users\Desktop\py\ex\009密码星号.py", line 16, in <module>
    if (password[i] == '*') and (i < len(password)):
IndexError: string index out of range

程序是可以运行的。我用的是3.8.5版本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-6 17:53:20 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-10-6 17:55 编辑
小_进 发表于 2020-10-6 17:52
感谢你的回答。
在提问中确实是因为某种因素,是输错了信息。
如下是程序的错误提示。


Traceback (most recent call last):
  File "D:/python/test/test.py", line 5, in <module>
    while times:
NameError: name 'times' is not defined

这是你给的代码的运行报错

还有
if password == code:
code是什么?
while i <= code_len:
i   是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-6 18:07:28 | 显示全部楼层
疾风怪盗 发表于 2020-10-6 17:53
Traceback (most recent call last):
  File "D:/python/test/test.py", line 5, in
    while time ...

好的,我发现我没有复制完全部内容。  十分尴尬
code = '密码是密码'
times = 3
i = 0 #循环参数,判断字符串内是否有星号
print('请输入密码:',end = '')
password = input()
code_len = len(password)

while times:
    if password == code:
        print('密码正确')
        break
    else: 
        while i <= code_len:
            if (password[i] == '*') and (i < len(password)):
                print('密码不能包含有‘*’!您还有',end = '')
                print(times ,end ='')
                print('次机会!请输入密码:',end = '')
                password = input()
                i = 0
            elif i == len(password):
                times -= 1
                if times == 0:
                    print('密码错误,次数已用完,账户锁定')
                    break
                i = 0
                print('密码输入错误!您还有' ,end = '')
                print(times ,end = '')
                print('次机会!请输入密码:' ,end = '')
                password = input()
                break
            else:
                i += 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-6 18:20:19 | 显示全部楼层    本楼为最佳答案   
小_进 发表于 2020-10-6 18:07
好的,我发现我没有复制完全部内容。  十分尴尬

先说这个报错,输入的字符长度,始终是大于索引的,索引是从0开始的,所以你输入四位字符串,实际最大的索引是3,所以
        while i <= code_len-1:
这样就不报错了

然后下面的逻辑貌似也有问题,输错密码,没提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-6 18:42:50 | 显示全部楼层
疾风怪盗 发表于 2020-10-6 18:20
先说这个报错,输入的字符长度,始终是大于索引的,索引是从0开始的,所以你输入四位字符串,实际最大的 ...

感谢您的回答。
我与别人讨论,发现还有一个解决办法,将
(password[i] == '*') and (i < code_len):
替换为如下
(i < code_len) and (password[i] == '*'):
也可以。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-6 18:46:14 | 显示全部楼层
小_进 发表于 2020-10-6 18:42
感谢您的回答。
我与别人讨论,发现还有一个解决办法,将

你这样是可以,因为i取不到最大值,前半个判断就否掉了,and是要两边都是真的才行,涉及到短路逻辑了

但是这样写,不推荐吧

你要怎么写其实都行吧,只要没bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-6 19:24:53 | 显示全部楼层
疾风怪盗 发表于 2020-10-6 18:46
你这样是可以,因为i取不到最大值,前半个判断就否掉了,and是要两边都是真的才行,涉及到短路逻辑了

...

好的,谢谢指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 11:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表