Caesar cipher代码无法去除标点:含标点输入输出异常求助
凯撒密码处理含标点文本异常:问题原因与解决方法
问题原因
- 标点过滤逻辑完全失效:你代码里
new_ans = ans.translate(str.maketrans(' ', ' ', string.punctuation))这行是对空字符串ans做处理,根本没碰输入的plaintext,等于白写,标点完全没被过滤。 - 所有字符(包括标点)都被移位:循环遍历的是原始
plaintext的每个字符,标点的ASCII码移位后会变成其他奇怪符号(比如#的ASCII是35,加10后变成45对应-;&是38加10变成48对应0),这就是输出异常的直接原因。 - 仅处理小写字母超界情况:代码只判断了
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
相关产品推荐
相关产品推荐

