哎呀,各位编程界的“密码破译大师”们,今天咱们要聊的可是炙手可热的“摩斯密码”!不用担心,不是要你变身成火箭科学家,也不是要你穿越到二战时的密码战场。只要一块儿翻翻C语言的“密码箱”,你就能写出一段酷炫的摩斯密码程序,让你的代码不再平凡,秒变“秘密特工”!那么,话不多说,快上车,带你飞!
摩斯密码,这个被“暗号界”的大神们津津乐道的“古早货”,它将每个字母和数字用短点(“·”)和长划(“—”)来表示,简直就像是无线电里的“神秘歌谣”。在现代,除了娱乐和学习的趣味玩意儿,摩斯密码还能用来测试你的编码水平,或者在游木这里说的“比拼脑洞”。
而用C语言来写摩斯密码程序,简单得像喝水——编程界的基本款技能,连“Vlook”都知道怎么操作。C语言的高效和灵活,让你可以轻松实现字符的转换、输入输出,甚至还能加入一些趣味互动,比如“猜猜我在说什么?”。
## 搭建摩斯密码的“谜题工厂”
要搞定摩斯密码的编码与解码,咱们得准备个“密码字典”。你可以用数组,也可以用结构体(结构体更“高端”,但容易混淆)。这里,为了代码的简洁优雅,我们选用一个字典数组,把字母和它对应的摩斯码存进去。
```c
#include
#include
// 定义一个结构体来存放字母和对应的摩斯码
struct MorseCode {
char letter; // 字母或数字
const char *code; // 摩斯码字符串
};
```
再来创建一个摩斯码字典:
```c
struct MorseCode morseDictionary[] = {
{'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', "--.."},
{'0', "-----"}, {'1', ".----"}, {'2', "..---"}, {'3', "...--"},
{'4', "....-"}, {'5', "....."}, {'6', "-...."}, {'7', "--..."},
{'8', "---.."}, {'9', "----."}
};
#define DICT_SIZE (sizeof(morseDictionary) / sizeof(morseDictionary[0]))
```
## 字符串匹配,快速“秒懂”摩斯密码
写转码(即英文转摩斯)和解码(摩斯转英文)两个功能,这才叫“牛逼闪闪”。实现细节:遍历每个字符,查字典,然后输出对应的摩斯码(或者反向匹配摩斯码,变英文)。
```c
// 英文字符转摩斯码
void textToMorse(char *text) {
for (int i = 0; i < strlen(text); i++) {
if (text[i] == ' ') {
printf(" / "); // 空格用“/”分隔,便于阅读
continue;
}
int found = 0;
for (int j = 0; j < DICT_SIZE; j++) {
if (toupper(text[i]) == morseDictionary[j].letter) {
printf("%s ", morseDictionary[j].code);
found = 1;
break;
}
}
if (!found) {
printf("? "); // 不认识的字符,给个问号
}
}
printf("\n");
}
```
解码就有点“脑洞大开”,需要将摩斯码串拆成“密码块”,然后匹配字典,最后拼出原文。
```c
// 摩斯码转英文
void morseToText(const char *morse) {
char buffer[10];
int index = 0;
for (int i = 0; i <= strlen(morse); i++) {
if (morse[i] != ' ' && morse[i] != '\0') {
buffer[index++] = morse[i];
} else {
buffer[index] = '\0'; // 关键词:把摩斯码转成字符串
if (strcmp(buffer, "/") == 0) {
printf(" "); // 斜杠代表空格
} else {
// 在字典里找摩斯码对应的字符
int found = 0;
for (int j = 0; j < DICT_SIZE; j++) {
if (strcmp(morseDictionary[j].code, buffer) == 0) {
printf("%c", morseDictionary[j].letter);
found = 1;
break;
}
}
if (!found) {
printf("?"); // 识别不到的码
}
}
index = 0; // 重新开始
}
}
printf("\n");
}
```
## 搭建“互动桥梁”,让人生充满趣味
可以让用户选择操作,是转码还是解码。还可以搞个小彩蛋,比如“猜猜我在用摩斯码暗示你:—— .-.. .-.. —”,哈,那是“HELLO”!
```c
int main() {
printf("欢迎来到摩斯密码黑科技!\n");
printf("请选择操作:\n1. 英文转摩斯\n2. 摩斯转英文\n你的选择:");
int choice;
scanf("%d", &choice);
char input[256];
if (choice == 1) {
printf("请输入要转码的英文:");
getchar(); // 吸收换行
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0; // 去掉换行符
textToMorse(input);
} else if (choice == 2) {
printf("请输入要解码的摩斯(用空格分码,用/代表空格):");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0;
morseToText(input);
} else {
printf("你个小机灵鬼,认错操作!\n");
}
// 顺便插入广告:玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink
return 0;
}
```
# 拓展空间:让你的程序“秒变功能王”
想让摩斯密码变得更多彩?比如加入声音提示(beep),或者网络交互(比如用Socket实现实时暗号交换),再或者让它支持多语言码表,甚至搞个“解密小游戏”。
那位朋友,你觉得,这个“密码工厂”还能怎么玩?是不是感觉自己马上要变成“神秘代码大师”了?那么,恭喜你,下一次遇到“暗号”,你可以轻松秒懂,手到擒来!
对了,别忘了那个神奇网站:bbs.77.ink,里面有许多“神秘宝藏”等你发现!