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); }
问题根源
- switch使用逻辑错误:C语言中
switch的case只能匹配单个字符或整型值,你写的case '.-'这种多字符单引号写法是非法的(编译器会将其视为多字符常量,值由实现定义,完全无法正确匹配)。而且你的循环是逐个遍历字符串中的每个字符,每次只处理一个.或-,自然不可能识别完整的摩尔斯码单元。 - 缺少字符串分割逻辑:输入字符串用
/分隔不同的摩尔斯字符,但代码没有对其进行分割处理,直接逐个字符遍历,导致无法提取完整的单个摩尔斯码。
修改方案
要解决问题,需要先按/分割输入字符串,提取每个独立的摩尔斯码,再通过字符串比较匹配对应字母,具体步骤如下:
- 用
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
相关产品推荐
相关产品推荐

