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

新手Caesar Cypher(凯撒加密)代码运行异常问题求助

凯撒加密代码问题修复方案

错误原因分析

  • 核心逻辑错误:循环遍历对象与下标使用完全错位
    你写的for position in text遍历的是文本的每一个字符,获取的place是该字符在字母表中的索引,而非该字符在输入文本中的下标。直接用place作为密文列表cypher的赋值下标,会直接触发你遇到的两个异常:
    1. 重复字符只会修改密文列表的同一个位置:比如输入aaa,三个a的place都是0,三次循环都只修改cypher[0],最终只有第一个字符加密成功,输出baa;而输入abc这类无重复、字符在字母表的索引刚好和文本下标匹配的内容,会碰巧得到正确结果。
    2. 字符在字母表的索引大于输入文本长度时直接触发越界:比如输入长度为3的fel,字符l在字母表的索引是11,远大于密文列表最大下标2,自然触发IndexError,和移位值大小没有任何关系。
  • 隐藏问题1:未对移位值取模26,当移位值大于等于26时,访问alphabet[cypher_place]也会触发越界报错。
  • 隐藏问题2:代码中未定义alphabet字母表变量,直接运行会报错。

修复后完整代码

# 预先定义字母表
alphabet = [chr(ord('a') + i) for i in range(26)]
direction = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n")
text = input("Type your message:\n").lower()
shift = int(input("Type the shift number:\n"))
# 移位值取模26,避免溢出
shift = shift % 26

def encrypt(text, shift):
    text_list = list(text)
    cypher = text_list.copy()
    # 遍历输入文本的下标,而非字符
    for idx in range(len(text_list)):
        current_char = text_list[idx]
        place = alphabet.index(current_char)
        cypher_place = place + shift
        # 给密文列表对应下标的位置赋值
        cypher[idx] = alphabet[cypher_place]
    cypher_text = "".join(cypher)
    print(cypher_text)

encrypt(text, shift)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:36:05