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

实现Caesar Cipher时大小写字符加密结果异常求助

Caesar密码大小写处理异常修复

问题代码

from string import ascii_lowercase as alphabet1
from string import ascii_uppercase as alphabet2

import letter as letter


def cipher(user_input, shift):
    cipher1 = {char: alphabet1[(i + shift) % 26] for i, char in enumerate(alphabet1)}
    cipher2 = {char: alphabet2[(i + shift) % 26] for i, char in enumerate(alphabet2)}
    
    caesar_cipher = ""
    
    for letter in user_input:
        caesar_cipher += cipher1.get(letter, letter)
    else:
        caesar_cipher += cipher2.get(letter, letter)
    return caesar_cipher


if __name__ == "__main__":
    user_input = input("Enter the String: ")
    shift = int(input("Enter shift: "))
    print("Caesar Cipher: " + cipher(user_input, shift))

问题描述

尝试实现支持大小写字符的Caesar密码,但运行结果不符合预期:

  • 小写测试:
    输入:abc,偏移量2
    输出:cdec,预期:cde
  • 大写测试:
    输入:ABC,偏移量2
    输出:ABCE,预期:CDE

错误原因

  1. for-else逻辑误用:Python中for后的else块会在循环正常结束(未被break中断)时执行,这里每次循环结束后都会额外把最后一个字符用cipher2处理并追加,导致结果多了一个字符。
  2. 大写字符未被处理:循环内只处理小写字符(用cipher1),大写字符直接原封不动保留,只有最后一个字符会在else块中尝试用cipher2转换,所以大写测试中前两个字符A、B没被转换,最后一个C被转成E,才出现ABCE的结果。

修复后的代码

from string import ascii_lowercase as alphabet1
from string import ascii_uppercase as alphabet2

def cipher(user_input, shift):
    cipher1 = {char: alphabet1[(i + shift) % 26] for i, char in enumerate(alphabet1)}
    cipher2 = {char: alphabet2[(i + shift) % 26] for i, char in enumerate(alphabet2)}
    
    caesar_cipher = ""
    
    for char in user_input:
        # 先尝试小写转换,失败则尝试大写转换,都失败则保留原字符
        caesar_cipher += cipher1.get(char, cipher2.get(char, char))
    return caesar_cipher


if __name__ == "__main__":
    user_input = input("请输入字符串: ")
    shift = int(input("请输入偏移量: "))
    print("凯撒密码结果: " + cipher(user_input, shift))

验证结果

  • 小写测试:输入abc,偏移2,输出cde,符合预期。
  • 大写测试:输入ABC,偏移2,输出CDE,符合预期。
  • 混合测试:输入AbC123,偏移3,输出DeF123,正常处理大小写,保留非字母字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:46:14