为何Morse Code解码工具的MorseCodeDecoder函数无法识别后续编码字符?
摩斯码解码器异常问题排查与修复
异常根因定位
以提到的输入".... .."为例,原代码仅能解出首个字母H、无法识别后续..编码的问题,由三处逻辑错位导致:
- 字母边界判断逻辑错位:原代码固定以遍历位置的下一个字符是否为空格作为解码触发条件,完全没对当前遍历的字符做类型分流。当程序走到首个字母后的单空格位置时,空格本身不属于摩斯编码的
./-字符,会被直接拼入EncodedLetter,让原本合法的"...."变成带空格的无效值,字典反查时触发的错误会被全局异常捕获块直接吞掉,后续字符处理流程完全断流。 - 单词间隔判断逻辑失效:原代码的双空格识别分支写在单空格判断分支之后,运行时永远不会被触发;且判断条件
MSG[i+1] + MSG[i+2] == ' '频繁触发索引越界,错误被异常块吞掉,无法正确区分单字母空格间隔和双词空格间隔。 - 输出拼接逻辑冗余:每完成一次字母解码就重复拼接
DecodedWord到结果中,造成输出内容重复堆积,进一步干扰状态判断。
修复方案与实现
首先新增反向摩斯映射字典,替代原代码每次解码时遍历列表查找索引的写法,降低反查的出错概率;再重构解码逻辑,取消超前读取i+1的越界写法,按当前遍历字符的类型分流处理,从根源上避免状态错乱。
修复后完整可运行代码
# 正向编码字典保持原有结构 MorseCodeDictionary = {' ': ' ', 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----'} # 新增反向映射表,专供解码查询使用 ReverseMorseDict = {value: key for key, value in MorseCodeDictionary.items()} def MorseCodeEncoder(MSG): EncodedMSG = f"""Encoded Message: """ MSG = MSG.upper() for char in MSG: EncodedMSG = f"{EncodedMSG} {MorseCodeDictionary.get(char, '')}" return EncodedMSG def MorseCodeDecoder(MSG): decoded_result = "Decoded Message:\n" current_encoded = "" # 逐字符遍历,不超前读后续位置,从根源避免越界 for char in MSG.strip().upper(): # 识别到摩斯编码符号时,直接累积到当前待解码字符 if char in ('.', '-'): current_encoded += char # 识别到空格时判定边界 elif char == ' ': # 如果当前没有正在累积的编码,说明碰到的是双空格的单词间隔 if not current_encoded: decoded_result += ' ' # 否则就是单空格的字母间隔,完成当前字符解码后清空累积变量 else: decoded_result += ReverseMorseDict.get(current_encoded, '') current_encoded = "" # 处理字符串末尾没有空格触发的最后一个编码 if current_encoded: decoded_result += ReverseMorseDict.get(current_encoded, '') return decoded_result # 原有交互循环逻辑保持不变 Loop = 1 while Loop == 1: Choice = str(input("""[1] Encode, or [2] decode? """)) if Choice == '1': MSG = str(input("""Type the message you would like to encode. Do not use punctuation. """)) EncodedMSG = (MorseCodeEncoder(MSG)) print (EncodedMSG) elif Choice == '2': MSG = str(input("""Type what you wish to decode. """)) DecodedMSG = (MorseCodeDecoder(MSG)) print (DecodedMSG) else: print ('1, or 2')
修复后运行效果
输入".... .."时,程序会先累积得到....,碰到第一个单空格时解码为H;继续累积得到..,遍历到字符串末尾时完成解码为I,最终输出Decoded Message: HI。输入包含双空格的多单词编码时,程序也能正确识别单词间隔,输出对应明文空格。
内容的提问来源于stack exchange,提问作者HowCanDoesCK
相关产品推荐
相关产品推荐

