开发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
相关产品推荐
相关产品推荐

