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

Caesar cipher代码无法去除标点:含标点输入输出异常求助

凯撒密码处理含标点文本异常:问题原因与解决方法

问题原因

  1. 标点过滤逻辑完全失效:你代码里new_ans = ans.translate(str.maketrans(' ', ' ', string.punctuation))这行是对空字符串ans做处理,根本没碰输入的plaintext,等于白写,标点完全没被过滤。
  2. 所有字符(包括标点)都被移位:循环遍历的是原始plaintext的每个字符,标点的ASCII码移位后会变成其他奇怪符号(比如#的ASCII是35,加10后变成45对应-;&是38加10变成48对应0),这就是输出异常的直接原因。
  3. 仅处理小写字母超界情况:代码只判断了c > 122(小写z的ASCII),但没考虑空格、大写字母等其他字符的处理逻辑。

解决方法

核心思路:先过滤输入文本中的标点,再对过滤后的有效字符进行加密,同时完善字符处理逻辑(保留空格、兼容大小写)。

修改后的完整代码:

import string

def encrypt(plaintext, shift):
    # 第一步:过滤所有标点符号,保留字母和空格
    filtered_text = plaintext.translate(str.maketrans('', '', string.punctuation))
    ans = ""
    for c in filtered_text:
        # 处理小写字母
        if c.islower():
            c_ord = ord(c) + shift
            # 超出z的范围就循环回a
            if c_ord > ord('z'):
                c_ord -= 26
            ans += chr(c_ord)
        # 处理大写字母(可选,根据课程需求调整)
        elif c.isupper():
            c_ord = ord(c) + shift
            if c_ord > ord('Z'):
                c_ord -= 26
            ans += chr(c_ord)
        # 非字母字符(比如空格)直接保留
        else:
            ans += c
    return ans

print('Lets encode a phrase using the Ceasar Cipher.')
shift1 = int(input('Enter the shift you want: '))
userinp2 = input('Please enter your phrase to be encoded: ')
print(encrypt(userinp2, shift1))

关键修改点说明

  • filtered_text = plaintext.translate(str.maketrans('', '', string.punctuation)):直接对输入的plaintext做过滤,第三个参数string.punctuation指定要删除的所有标点,前两个空字符串表示不需要替换其他字符。
  • 循环遍历filtered_text而非原始plaintext,确保只处理无标点的有效内容。
  • 增加islower()、isupper()判断,分别处理大小写字母的循环移位,非字母字符(如空格)直接保留。

测试验证:输入day#g&i,shift=10时,过滤后得到daygi,加密结果为nkiqs,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:37:31