Vigenère解密函数无法保留空格输出的问题求助
Vigenère解密函数无法保留空格输出的问题求助
嘿,我来帮你排查下这个问题~你的代码里确实有几个逻辑漏洞导致空格没法正确保留,咱们一步步拆解清楚:
核心问题分析
- 循环嵌套逻辑混乱:你先把加密文本去掉空格存到
encrypted_text里,外层循环处理这些字符计算偏移后,又套了一个遍历原text的内层循环——这会导致每个解密后的字符被重复添加多次,完全打乱了字符顺序。 - 空格判断语法错误:
if c in text == " "这种写法完全不成立,正确的空格判断应该是if c == " ",原代码里这行逻辑永远不会触发,自然没法添加空格。 - 字符偏移复用错误:外层循环计算的
shifted_char对应encrypted_text里某个字符的偏移,但内层循环直接拿这个偏移套用所有字符,没有对应到正确的原字符位置,解密结果必然出错。
修正后的代码
咱们重新梳理逻辑:直接遍历原文本的每个字符,遇到空格直接保留;遇到字母时,用计数器跟踪非空格字符的位置,匹配对应的密钥字符解密:
def vigenere_decrypt(key: str, text: str) -> str: decrypted_text = "" # 统一密钥为小写,避免大小写干扰 key = key.lower() key_length = len(key) # 跟踪当前处理到第几个非空格字符 non_space_index = 0 for char in text: if char == " ": # 空格直接加入结果 decrypted_text += " " continue # 匹配对应位置的密钥字符 key_char = key[non_space_index % key_length] # 计算解密偏移:先转成0-25的字母范围,再还原为字符 shifted_value = (ord(char.lower()) - ord(key_char)) % 26 decrypted_char = chr(shifted_value + ord('a')) decrypted_text += decrypted_char non_space_index += 1 return decrypted_text print(vigenere_decrypt("math", "yadl ut ahbpxu"))
代码说明
- 直接遍历原文本,遇到空格直接保留,不用先去除空格再处理,自然保留空格的原始位置。
- 用
non_space_index跟踪非空格字符的计数,确保每个需要解密的字母都能匹配到正确的密钥字符。 - 修正了偏移计算逻辑,确保每个字母的解密都基于对应的密钥字符,避免原代码循环嵌套导致的重复计算问题。
运行这段代码就能得到带空格的正确解密结果啦~
备注:内容来源于stack exchange,提问作者zeynepdirier
相关产品推荐
相关产品推荐

