摩尔斯电码(morse)转换英文字符串c语言代码

2023-10-10 09:48

本文主要是介绍摩尔斯电码(morse)转换英文字符串c语言代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        找到这篇文章说明你对摩尔斯电码很赶兴趣,而且你已掌握了摩尔斯电码的基础知识了。想更贴近的感受一下摩尔斯电码的魅力。或你有一个非常棒的关于莫尔斯电码想法而非常激动。如果是这样的话,那你或许会从我的代码中得到帮助,缩短你实现想法征途。如果真的能帮助你的话,那么我也会很高兴。我也是如此的喜欢摩尔斯电码。

        有任何疑问或者有想法想与人一起分享,邮箱我:robert.cysy@gmail.com


我把代码放到了github上了 地址 https://github.com/robert1207/morse_encode.git

可以在Linux下用Makefile 编译,也可以在windows下新建工程添加github上的代码就可以了


下面是代码片段:

#include #include #include #include "morse.h"
#define BUF_LEN 300
int main() {
char *mystr = "abcdefghijklmnopqrstuvwxyz0123456789.:,;?='/!-_\"()$&@";
char mor[BUF_LEN];
char str[BUF_LEN];
char out[BUF_LEN];
memset(out, 0, BUF_LEN);
memset(mor, 0, BUF_LEN);
memset(str, 0, BUF_LEN);
printf("base string:\n%s\n", mystr);
//TO LOWCASE
str2lowcase(mystr, out, BUF_LEN);
//TO MORSE STRING
String2MorseString(out , mor, BUF_LEN);
printf("\nget morse code string:\n%s\n" , mor);
//TO NORMAL STRING
MorseString2String(mor, str, BUF_LEN);
printf("\nget decode string:\n%s\n", str);
return 0;
}

#include "morse.h"
#include #include #include #define NUM_LEN 10
char num[][5] = {
{'-','-','-','-','-'},//0
{'.','-','-','-','-'},//1
{'.','.','-','-','-'},//2
{'.','.','.','-','-'},//3
{'.','.','.','.','-'},//4
{'.','.','.','.','.'},//5
{'-','.','.','.','.'},//6
{'-','-','.','.','.'},//7
{'-','-','-','.','.'},//8
{'-','-','-','-','.'} //9
};
#define MARK_LEN 17
char mark[][8] = {
{'.', '-', '.', '-', '.', '-', '*', '.'},//.	0
{'-', '-', '-', '.', '.', '.', '*', ':'},//:
{'-', '-', '.', '.', '-', '-', '*', ','},//,
{'-', '.', '-', '.', '-', '.', '*', ';'},//;
{'.', '.', '-', '-', '.', '.', '*', '?'},//?
{'-', '.', '.', '.', '-', '*', '*', '='},//=
{'.', '-', '-', '-', '-', '.', '*', '\''},//'
{'-', '.', '.', '-', '.', '*', '*', '/'},///
{'-', '.', '-', '.', '-', '-', '*', '!'},//!
{'-', '.', '.', '.', '.', '-', '*', '-'},//-
{'.', '.', '-', '-', '.', '-', '*', '_'},//_
{'.', '-', '.', '.', '-', '.', '*', '"'},//"
{'-', '.', '-', '-', '.', '*', '*', '('},//(
{'-', '.', '-', '-', '.', '-', '*', ')'},//)
{'.', '.', '.', '-', '.', '.', '-', '$'},//$
{'.', '-', '.', '.', '.', '*', '*', '&'},//&
{'.', '-', '-', '.', '-', '.', '*', '@'} //@	16
};
#define CHARACTER 26
char a2[][4] = {
{'.','-','*','*'},//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
};
Morse_t *new_morse() {
Morse_t *ret;
ret = (Morse_t*)malloc(sizeof(Morse_t));
memset(ret->c, 0, 9);
return ret;
}
/*
*	MARK
*/
bool mark2morse(char n, Morse_t *morse) {
int a = 0;
for (; a < MARK_LEN; a++) {
if (mark[a][7] == n) {
morse->c[0] = mark[a][0];
morse->c[1] = mark[a][1];
morse->c[2] = mark[a][2];
morse->c[3] = mark[a][3];
morse->c[4] = mark[a][4];
morse->c[5] = mark[a][5];
morse->c[6] = mark[a][6];
return true;
}
}
return false;
}
bool morse2mark(Morse_t *morse, char *n) {
int a = 0;
for (; a < MARK_LEN; a++) {
if (mark[a][0] == morse->c[0] &&
mark[a][1] == morse->c[1] &&
mark[a][2] == morse->c[2] &&
mark[a][3] == morse->c[3] &&
mark[a][4] == morse->c[4] &&
mark[a][5] == morse->c[5] &&
mark[a][6] == morse->c[6] ) {
*n = mark[a][7];
return true;
}
}
return false;
}
/*
*	NUMBER
*/
bool num2morse(char n, Morse_t *morse) {
int pos = n - 48;
if (pos <= 9 && pos >= 0) {
morse->c[0] = num[pos][0];
morse->c[1] = num[pos][1];
morse->c[2] = num[pos][2];
morse->c[3] = num[pos][3];
morse->c[4] = num[pos][4];  
return true;
} 
return false;
}
bool morse2num(Morse_t *morse, char *n) {
int i = 0;
for (; i < NUM_LEN; i++) {
if (num[i][0] == morse->c[0] &&
num[i][1] == morse->c[1] &&
num[i][2] == morse->c[2] &&
num[i][3] == morse->c[3] &&
num[i][4] == morse->c[4] ) {
*n = (char)(i + 48);
return true;
}
}
return false;
}
/*
*	CHARACTER
*/
bool str2morse(char m , Morse_t *morse) {
int pos = m - 97;
if (pos >= 0 && pos <= 25) {
morse->c[0] = a2[pos][0];
morse->c[1] = a2[pos][1];
morse->c[2] = a2[pos][2];	
morse->c[3] = a2[pos][3];
return true;
}
return false;
}
bool morse2str(Morse_t *morse, char *ch) {
int i = 0;
for (i = 0; i < CHARACTER; i++) {
if (a2[i][0] == morse->c[0] &&
a2[i][1] == morse->c[1] &&
a2[i][2] == morse->c[2] &&
a2[i][3] == morse->c[3]) { 
*ch =  (char)(i + 97);
return true;
}
}
return false;
}
void MorseString2String(char *morse ,char *string, int buf_len) {
Morse_t *temp = new_morse();
int a = 0;
int b = 0;
int c = 0;
int len = 0;
char ch = '*';
memset(temp->c, '*', 8);
len = strlen(morse);
for ( ; a < len; a ++) {
if (c > buf_len) {
printf("the string buffer is too little\n");
return;
}
if (morse[a] != SEPARATOR && morse[a] != FAKE_SPACE)
temp->c[b++] = morse[a];
else if (morse[a] == SEPARATOR && morse[a-1] != FAKE_SPACE) {//get one charactor
if (true == morse2str(temp, &ch) && b < 5) {
string[c++] = ch;
} else if (true == morse2num(temp, &ch)) {
string[c++] = ch;
} else if (true == morse2mark(temp, &ch)) {
string[c++] = ch;
} else {
printf("has morse that not be decoded !\n");
}
//clean
b = 0;
memset(temp->c, '*' ,8);
} else if (morse[a] == FAKE_SPACE) { //have a space
string[c++] = ' ';
}
} 
}
void String2MorseString(char *string ,char *morse, int buf_len) {
int a = 0;
int b = 0;
int len = strlen(string);
Morse_t * temp = new_morse();
for (; a < len; a ++ ) {
if (buf_len < 8 || b >= buf_len) {
printf("morse buffer is too litte\n");
break;
}
if (string[a] != ' ') {
//if is a num 
if (string[a] >= '0' && string[a] <= '9') {
if (true == num2morse(string[a], temp)) {
morse[b++] = temp->c[0];
morse[b++] = temp->c[1];
morse[b++] = temp->c[2];
morse[b++] = temp->c[3];
morse[b++] = temp->c[4];
} else {
printf("encode on mumber error \n");
return ;
}
}
//if is a character
else if (string[a] >= 97 && string[a] <= 122) {
if (true == str2morse(string[a], temp)) {
morse[b++] = temp->c[0];
if (temp->c[1] != '*')
morse[b++] = temp->c[1];
if (temp->c[2] != '*')
morse[b++] = temp->c[2];
if (temp->c[3] != '*')
morse[b++] = temp->c[3];
} else {
printf("encode on str error \n");
return ;
}
}
//if is a mark
else if (string[a] <= 127) {
if (true == mark2morse(string[a], temp)) {
morse[b++] = temp->c[0]; 
morse[b++] = temp->c[1];
morse[b++] = temp->c[2];
morse[b++] = temp->c[3];
morse[b++] = temp->c[4];
if (temp->c[5] != '*')
morse[b++] = temp->c[5];
if (temp->c[6] != '*')
morse[b++] = temp->c[6];
} else {
printf("encode on mark error \n");
return ;
}
} else {
printf("out of the morse character \n");
return ;
}
//clean
memset(temp->c, 0 , 8);
morse[b++] = SEPARATOR;
} else if (string[a] == ' ') { //have a space and add / to instead
morse[b++] = FAKE_SPACE;
morse[b++] = SEPARATOR;
}
}
}
void str2lowcase(char *str, char *out, int buf_len) {
int len = strlen(str);
int a = 0;
if (len >= buf_len) {
printf("buf is to low\n");
return;
}
for (;a < len; a++) {
if (str[a] >= 'A' && str[a] <= 'Z') {
out[a] = str[a] + 32;
} else {
out[a] = str[a];
}
}
}
#ifndef MORSE_H_
#define MORSE_H_
typedef int bool;
#define false 0
#define true  1
/*
*  FAKE_SPACE IS MARING FOR A SPACE
*/
#define FAKE_SPACE '/'
/*
* THE CHARACTER THAT BETWEEN TWO MORSE STRING
*/
#define SEPARATOR ' '
typedef struct Morse Morse_t;
struct Morse{
char c[9];
};
Morse_t *new_morse();
bool str2morse(char m , Morse_t *morse);
bool morse2str(Morse_t *morse, char *ch);
bool mark2morse(char n, Morse_t *morse);
bool morse2mark(Morse_t *morse, char *n);
bool num2morse(char n, Morse_t *morse);
bool morse2num(Morse_t *morse, char *n);
void MorseString2String(char *morse ,char *string, int buf_len);
void String2MorseString(char *string ,char *morse, int buf_len);
void str2lowcase(char *str, char *out, int buf_len);
#endif /* MORSE_H_ */


这篇关于摩尔斯电码(morse)转换英文字符串c语言代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179655

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码