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

凯撒密码(Caesar Cipher)加密程序索引越界错误排查求助

问题分析与修复方案

嘿,我看到你的凯撒密码变种代码遇到了索引越界的问题,咱们来一步步理清楚哪里出问题了。

核心错误原因

你的字符集characters总共有92个字符(索引范围是0到91)。当你用偏移量70的时候,假设某个字符的索引是22,22 + 70 = 92——这明显超出了最大索引91,自然就会抛出String_Index_Out_Of_Range错误。

你尝试用while key > limit: key -= limit来简化偏移量,但这个逻辑有漏洞:即使key小于limit,字符索引加上key之后依然可能超过字符集的长度上限。而且解密时如果索引减去key得到负数,直接用负数索引会得到不符合预期的结果(虽然Python允许负数索引,但这和凯撒密码的解密逻辑不符)。

修复方案

解决这个问题的关键是用取模运算来处理偏移量和索引计算,因为偏移limit位相当于没有偏移,取模能自动把数值约束在有效范围内。

修改后的代码如下:

characters = '`1234567890-=qwertyuiopasdfghjklzxcvbnm,./~!@#$%^&*()_+|\\{}[]:;"\'QWERTYUIOPASDFGHJKLZXCVBNM'
key_raw = 70  # 之前报错的偏移量

def encode(text, key):
    output, text = '', str(text)
    limit = len(characters)
    key = key % limit  # 用取模简化偏移量,替代while循环
    for i in text:
        if i in characters:
            idx = characters.index(i)
            output += characters[(idx + key) % limit]  # 取模确保索引不越界
        else:
            output += i
    return output

def decode(text, key):
    output, text = '', str(text)
    limit = len(characters)
    key = key % limit
    for i in text:
        if i in characters:
            idx = characters.index(i)
            output += characters[(idx - key) % limit]  # 处理负数索引,保证解密逻辑正确
        else:
            output += i
    return output

# 测试加密解密一致性
test_text = 'Why do I get String_Index_Out_Of_Range?'
encoded_result = encode(test_text, key_raw)
decoded_result = decode(encoded_result, key_raw)
print(f"原文本: {test_text}")
print(f"解密后文本: {decoded_result}")
print(f"加密解密是否一致: {test_text == decoded_result}")

关键修改点解释

  1. 偏移量简化:用key = key % limit替代while循环,不管key是多大的正数或负数,都会被转化为0到limit-1之间的有效偏移量,逻辑更简洁可靠。
  2. 加密索引计算:(idx + key) % limit确保相加后的索引不会超出字符集范围,比如92 % 92 = 0,会自动回到第一个字符的位置。
  3. 解密索引计算:(idx - key) % limit处理了索引为负数的情况,比如(5 - 10) % 92 = 87,会正确映射到字符集里对应的解密字符,避免了负数索引带来的逻辑错误。

这样修改后,不管你用多大的偏移量(比如70、100、甚至负数),代码都能正常运行,而且加密再解密的结果会和原文本完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:55