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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 15:54:09