嘿,代码小白和键盘侠们,今天咱们聊聊那个“点点划划”能秒传秘密信息的老古董通信法——摩斯密码,顺便带你用C语言写个小程序,分分钟让你变身“电报达人”!如果你还不知道摩斯密码是啥,那我们得先科普一下,不然后面有点尬。摩斯密码就是用点(.)和划(-)的组合来表示字母、数字的神奇编码,早年间电报就是靠它传信息。不吹了,直奔主题,代码控们准备好了吗?
1. 摩斯码字典准备中
写这个程序,最先得有“字母-摩斯码”的映射表。C语言里,最常用的是数组或者结构体数组来存储这些对应关系。举个栗子,字母'A'对应“.?-”,数字1对应“?----”等等。大佬们建议直接搞个二维数组或者用struct存储字母和字符串的映射,方便后续查询和转换。
typedef struct {
char letter;
char *code;
} MorseMap;
MorseMap morseTable[] = {
{'A', ".-"}, {'B', "-..."}, {'C', "-.-."}, /* 继续补充全字母 */
{'1', ".----"}, {'2', "..---"}, /* 补充数字 */
{' ', "/"} // 代表空格的摩斯符号
};
const int morseTableSize = sizeof(morseTable) / sizeof(morseTable[0]);
这波直接炫酷了,后续只需要用循环匹配字母就能调出摩斯码,或者反过来查摩斯码转换成字母。存的结构体数组比用复杂的哈希表简单多了,直接手撸性能杠杠的。
2. 编写编码函数
编码即输入普通字符串,输出摩斯密码字符串。思路挺简单:遍历输入字符串,每个字符去映射表里找对应摩斯码,找到就拼接输出。小提示,大小写字母都得处理,记得统一成大写或者小写,查表方便。
void encodeToMorse(const char *input, char *output, int maxLen) {
int pos = 0;
for (int i = 0; input[i] != '\0' && pos < maxLen - 1; i++) {
char ch = toupper(input[i]);
int found = 0;
for (int j = 0; j < morseTableSize; j++) {
if (morseTable[j].letter == ch) {
int k = 0;
while (morseTable[j].code[k] != '\0' && pos < maxLen - 1) {
output[pos++] = morseTable[j].code[k++];
}
output[pos++] = ' '; // 每个摩斯码后加空格区分
found = 1;
break;
}
}
if (!found) {
// 不识别字符默认为空格(也可以跳过)
output[pos++] = '/';
output[pos++] = ' ';
}
}
output[pos] = '\0';
}
看,代码简洁明了,是不是还挺像写作业时候的范文呢?抛开那点学术范,这里咱互动一波:你要是写错字符,比如“@”啥的,程序简单处理成“/”,意思就是“空格”或者“分割”,你觉得合理不合理?留言告诉我!
3. 解码大作战
解码更有挑战,输入摩斯码字符串,输出普通文字。难点在于要把摩斯码拆分成一个个代码单元,然后按表反查对应字母。代码写起来稍微费点劲,但我给你来了个简单高效版本。
void decodeFromMorse(const char *input, char *output, int maxLen) {
int pos = 0;
char buffer[10]; // 临时存单个摩斯码
int bufIndex = 0;
for (int i = 0; input[i] != '\0' && pos < maxLen - 1; i++) {
if (input[i] != ' ' && input[i] != '\0') {
buffer[bufIndex++] = input[i];
} else {
buffer[bufIndex] = '\0';
bufIndex = 0;
if (strcmp(buffer, "/") == 0) {
output[pos++] = ' ';
} else {
int found = 0;
for (int j = 0; j < morseTableSize; j++) {
if (strcmp(morseTable[j].code, buffer) == 0) {
output[pos++] = morseTable[j].letter;
found = 1;
break;
}
}
if (!found) {
output[pos++] = '?'; // 无法识别用问号代替
}
}
}
}
output[pos] = '\0';
}
这段代码的重点是,遇见空格表示一个摩斯码结束,刚好拆出来查一查。遇到“/”就打空格,识别不了的就直接???问号来了,表示我朋友,这段代码也有“小脾气”。
4. 主函数设计,交互感满分
怎么让程序好玩?肯定得来个小互动输入,让你自己输内容试试!代码模板当然不能少,关键是得幽默点,敲代码不闷才是真的开心。你不妨抛个迷惑题给我:摩斯码里的点和划,谁更爱劳累?没错,划更费劲,反正我代码偶尔也要“划”泪了。
int main() {
char input[256], output[1024];
int choice;
printf("欢迎使用摩斯密码C语言小程序!\n");
printf("1. 编码\n2. 解码\n请选择 (1/2): ");
scanf("%d", &choice);
getchar(); // 吃掉换行符
if (choice == 1) {
printf("请输入要编码的字符串:");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0; // 去掉换行符
encodeToMorse(input, output, sizeof(output));
printf("摩斯密码是:%s\n", output);
} else if (choice == 2) {
printf("请输入摩斯码(点用'.', 划用'-', 空格分隔,空格用'/'): ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0;
decodeFromMorse(input, output, sizeof(output));
printf("解码结果是:%s\n", output);
} else {
printf("输入错误,程序结束。\n");
}
printf("顺便说一句,玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink\n");
return 0;
}
看完后,放心大胆地运行吧。输入普通话,敲完神秘摩斯码,直接秒懂隐藏信息,酷毙了。当然,用这个程序写情话可能会被“翻译官”嫌弃,毕竟摩斯密码不支持emoji,哭唧唧。
有小伙伴忍不住问了,这玩意真的还能用?其实,虽然时代飞速发展,但摩斯码的逻辑清晰且低成本,特别适合信号差、没网络的奇葩情况。要不你试试用它给朋友发个“老母鸡”密码?说不定还能听出“点划”节奏,开心一夏。
至于更高级的玩法?还可以加入声音输出啊,灯光闪烁啊,甚至结合树莓派或者Arduino,写个DIY“秘密信号机”。不过先别急,C语言搞定基础再说,毕竟抓牢代码根基,才能飞得更高。
好了,不管你是想学编程,还是想要偷偷传递小秘密,这段摩斯密码C语言小程序都能陪你玩转代码世界。别忘了炫技给你朋友看,秒变“科技小达人”那才叫风骚!
话说回来,摩斯密码里,点和划,爸爸妈咪谁更厉害?答案你自己用程序试试吧,等你解码出来咱们一起吐槽。毕竟代码里暗藏玄机,谁解开了就是王者!