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

开发C语言摩尔斯电码解码器:如何区分1个空格与3个空格?

C语言摩尔斯电码解码器:区分单空格与三空格的解决方案

由于fscanf会忽略所有空格,strtok会将连续空格视为单一分隔符,都无法满足区分1个空格(字母分隔)和3个空格(单词分隔)的需求。以下是两种实用的解决思路:

思路1:手动遍历字符串解析(推荐)

直接通过指针遍历输入字符串,精确统计空格数量,控制摩尔斯码的收集与转换逻辑,这是最可靠的方案:

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

// 摩尔斯码转字母的映射函数(示例实现,需补充完整映射表)
char morse_to_char(const char *morse) {
    if (strcmp(morse, "-") == 0) return 'E';
    if (strcmp(morse, ".-") == 0) return 'A';
    // 其他摩尔斯码映射...
    return '?'; // 未知码返回占位符
}

int main() {
    char input[256];
    // 读取整行输入
    if (fgets(input, sizeof(input), stdin) == NULL) {
        return 1;
    }
    // 移除换行符
    input[strcspn(input, "\n")] = '\0';

    char current_morse[16]; // 存储当前正在收集的摩尔斯码
    int morse_idx = 0;      // 当前摩尔斯码的字符索引
    int space_count = 0;    // 连续空格计数

    for (int i = 0; input[i] != '\0'; i++) {
        if (input[i] == ' ') {
            space_count++;
            // 遇到非空格字符或字符串结束时,处理已统计的空格
            if (input[i+1] != ' ' || input[i+1] == '\0') {
                // 如果有未转换的摩尔斯码,先转换输出
                if (morse_idx > 0) {
                    current_morse[morse_idx] = '\0';
                    printf("%c", morse_to_char(current_morse));
                    morse_idx = 0;
                }
                // 3个空格对应单词分隔,输出空格
                if (space_count == 3) {
                    printf(" ");
                }
                space_count = 0;
            }
        } else {
            // 收集摩尔斯码字符
            current_morse[morse_idx++] = input[i];
        }
    }

    // 处理字符串末尾剩余的摩尔斯码
    if (morse_idx > 0) {
        current_morse[morse_idx] = '\0';
        printf("%c", morse_to_char(current_morse));
    }
    printf("\n");

    return 0;
}

逻辑说明

  • 遍历过程中,收集非空格字符作为当前摩尔斯码片段
  • 遇到空格时累计计数,当空格序列结束时:
    • 若为1个空格:转换当前摩尔斯码为字母,准备下一个字母
    • 若为3个空格:转换当前字母后,输出单词分隔空格
  • 处理字符串末尾的剩余摩尔斯码,避免遗漏

思路2:替换特殊分隔符后分割

先将输入中的3个连续空格替换为一个唯一的特殊标记(如|),再按单空格和特殊标记分割字符串,实现区分:

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

char morse_to_char(const char *morse) {
    if (strcmp(morse, "-") == 0) return 'E';
    if (strcmp(morse, ".-") == 0) return 'A';
    return '?';
}

int main() {
    char input[256];
    if (fgets(input, sizeof(input), stdin) == NULL) {
        return 1;
    }
    input[strcspn(input, "\n")] = '\0';

    // 将连续3个空格替换为特殊标记|
    char *pos;
    while ((pos = strstr(input, "   ")) != NULL) {
        // 移动字符覆盖后两个空格,将第一个空格替换为|
        memmove(pos + 1, pos + 3, strlen(pos + 3) + 1);
        *pos = '|';
    }

    char *p = input;
    while (*p) {
        if (*p == '|') {
            // 遇到标记输出单词分隔空格
            printf(" ");
            p++;
        } else if (*p == ' ') {
            // 单空格直接跳过(字母分隔)
            p++;
        } else {
            // 收集摩尔斯码片段并转换
            char *start = p;
            while (*p && *p != ' ' && *p != '|') {
                p++;
            }
            char temp = *p;
            *p = '\0';
            printf("%c", morse_to_char(start));
            *p = temp;
            p++;
        }
    }
    printf("\n");

    return 0;
}

注意事项

  • 替换时需注意处理重叠的空格(如4个空格会被转换为| ,符合"单词分隔+字母分隔"的逻辑)
  • 此方案依赖字符串替换的准确性,若输入存在不规则空格(如2个空格),需额外处理

内容的提问来源于stack exchange,提问作者Yakov Fainshetin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:50:24