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

C语言摩尔斯电码转英文问题:无法识别完整摩尔斯字符

问题描述

我写了一段将摩尔斯电码转换为英文字符的C语言代码,但目前代码仅能识别单个.或-,无法匹配switch语句中定义的完整摩尔斯字符。我尝试将摩尔斯电码的单引号改为双引号,结果仍只能识别首个符号,请问该如何修改才能识别完整的摩尔斯字符?

原代码如下:

#include <stdio.h>
#include<string.h>

int main (void){

    char str[20]=".-/.-/.-";
    int i;
    char letter;


//  printf("%s is %d long", str,strlen(str));


    for(i=0; i<strlen(str); i++){
    
        switch(str[i]){ 
                            /*switch statements set out decimal values for Hex digits*/
            case '.-':
                letter ='A';
                break;
            case '-...':
                letter = 'B';
                break;
            case '-.-.':
                letter = 'C';
                break;
            case '-..':
                return 'D';
                break;
            case '.':
                letter = 'E';
                break;
            case '..-.':
                letter = 'F';
                break;
            case '--.':
                letter = 'G';
                break;
            case '....':
                letter = 'H';
                break;
            case '..':
                letter = 'I';
                break;
            case '.---':
                letter = 'J';
                break;
            case '-.-.':
                letter = 'K';
                break;
            case '.-..':
                letter = 'L';
                break;
            case '--':
                letter = 'M';
                break;
            case '-.':
                letter = 'N';
                break;
            case '---':
                letter = 'O';
                break;
            case '.--.':
                letter = 'P';
                break;
            case '--.-':
                letter = 'Q';
                break;
            case '.-.':
                letter = 'R';
                break;
            case '...':
                letter = 'S';
                break;
            case '-':
                letter = 'T';
                break;
            case '..-':
                letter = 'U';
                break;
            case '...-':
                letter = 'V';
                break;
            case '.--':
                letter = 'W';
                break;
            case '-..-':
                letter = 'X';
                break;
            case '-.--':
                letter = 'Y';
                break;
            case '--..':
                letter = 'Z';
                break;
            default:
            printf("Something went wrong\n");
            break;
    }

}
printf("%d",letter);
}

问题根源
  1. switch使用逻辑错误:C语言中switch的case只能匹配单个字符或整型值,你写的case '.-'这种多字符单引号写法是非法的(编译器会将其视为多字符常量,值由实现定义,完全无法正确匹配)。而且你的循环是逐个遍历字符串中的每个字符,每次只处理一个.或-,自然不可能识别完整的摩尔斯码单元。
  2. 缺少字符串分割逻辑:输入字符串用/分隔不同的摩尔斯字符,但代码没有对其进行分割处理,直接逐个字符遍历,导致无法提取完整的单个摩尔斯码。

修改方案

要解决问题,需要先按/分割输入字符串,提取每个独立的摩尔斯码,再通过字符串比较匹配对应字母,具体步骤如下:

  • 用strtok函数按/分割输入字符串,得到每个单独的摩尔斯码片段。
  • 用strcmp函数将每个摩尔斯码片段与预设的摩尔斯码-字母对应关系比对,找到匹配的字母。
  • 修复原代码中的错误(比如case '-..'里错误的return 'D',应改为赋值给letter后break)。

修改后的完整代码
#include <stdio.h>
#include <string.h>

int main(void) {
    char str[20] = ".-/.-/.-";
    char *token;
    char letter;

    // 按'/'分割字符串,提取每个摩尔斯码
    token = strtok(str, "/");
    while (token != NULL) {
        // 用strcmp匹配每个摩尔斯码对应的字母
        if (strcmp(token, ".-") == 0) {
            letter = 'A';
        } else if (strcmp(token, "-...") == 0) {
            letter = 'B';
        } else if (strcmp(token, "-.-.") == 0) {
            letter = 'C';
        } else if (strcmp(token, "-..") == 0) {
            letter = 'D';
        } else if (strcmp(token, ".") == 0) {
            letter = 'E';
        } else if (strcmp(token, "..-.") == 0) {
            letter = 'F';
        } else if (strcmp(token, "--.") == 0) {
            letter = 'G';
        } else if (strcmp(token, "....") == 0) {
            letter = 'H';
        } else if (strcmp(token, "..") == 0) {
            letter = 'I';
        } else if (strcmp(token, ".---") == 0) {
            letter = 'J';
        } else if (strcmp(token, "-.-") == 0) { // 修正原代码中K的摩尔斯码错误
            letter = 'K';
        } else if (strcmp(token, ".-..") == 0) {
            letter = 'L';
        } else if (strcmp(token, "--") == 0) {
            letter = 'M';
        } else if (strcmp(token, "-.") == 0) {
            letter = 'N';
        } else if (strcmp(token, "---") == 0) {
            letter = 'O';
        } else if (strcmp(token, ".--.") == 0) {
            letter = 'P';
        } else if (strcmp(token, "--.-") == 0) {
            letter = 'Q';
        } else if (strcmp(token, ".-.") == 0) {
            letter = 'R';
        } else if (strcmp(token, "...") == 0) {
            letter = 'S';
        } else if (strcmp(token, "-") == 0) {
            letter = 'T';
        } else if (strcmp(token, "..-") == 0) {
            letter = 'U';
        } else if (strcmp(token, "...-") == 0) {
            letter = 'V';
        } else if (strcmp(token, ".--") == 0) {
            letter = 'W';
        } else if (strcmp(token, "-..-") == 0) {
            letter = 'X';
        } else if (strcmp(token, "-.--") == 0) {
            letter = 'Y';
        } else if (strcmp(token, "--..") == 0) {
            letter = 'Z';
        } else {
            printf("无法识别的摩尔斯码: %s\n", token);
            letter = '?';
        }
        printf("%c", letter);
        // 获取下一个摩尔斯码片段
        token = strtok(NULL, "/");
    }
    printf("\n");
    return 0;
}

额外说明
  • 原代码中K的摩尔斯码写错了,正确的应为-.-而非-.-.(-.-.是C的摩尔斯码),已在修改后的代码中修正。
  • strtok函数会修改原字符串,若需保留原字符串,可先复制一份再进行分割。

内容的提问来源于stack exchange,提问作者Dave Anderson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:57:51