C语言 由拼音字串获取拼音数量
来源:互联网 发布:厂价直销淘宝怎么设置 编辑:程序博客网 时间:2024/06/04 01:02
由拼音字串中获取拼音数量
1、查找声韵表数据,整理成声韵表数组,一维为声母,二维为韵母,符合拼音规则匹配则为1 否则为0
本文的声韵匹配表数据由该链接获取并根据情况加以修改:http://www.docin.com/p-314586395.html
2、检索拼音时,由声母和最长韵母开始检索,逐一匹配
目前存在问题:以最长韵母检索失败,没有回退检索或者反向检索,例如:
pangu(盘古),首先检索出pang,然后u,但是u为韵母,没有声母来组成拼音,此时应该回退检索,或者反向检索,先检查出gu(古),再检查出pan(盘)即可,
有空再整理
ps:对于一些拼音组合,比如u v 等同或者区分,根据自己的情况可进行调整
/* * 声母: * 双唇音 b p m * 唇齿音 f * 舌尖中音 d t n l * 舌根音g k h * 舌面j q x * 舌尖后音zh ch sh r * 舌尖前音 z c s * * 零声母: * a o e ai ao an ou ei er en ang eng yi ya ye yao you yan yin yang ying * wu wa wo wai wei wan wen wang weng yu yue yuan yun yong * * 韵母:a o e i u v ai ei ui ao ou iu ie ve ue er an en in un vn ang eng ing ong * 开口呼 a o e ai ao an ou ei er en ang eng //12 * 齐齿呼 i ia ie iu in iao ian iang ing //9 * 合口呼 u ua uo ui un uai uan uang ueng ong //10 * 撮口呼 //v ve van vn iong v ve ue vn van iong //6 * * @param str 检测字符串 * @return 返回拼音数量, 0:字符串存在非拼音 */#define SMNUM 21 //声母数量#define ZEROSMNUM 36 //零声母数量#define YMNUM 37 //韵母数量int get_pinyinnum(char *str){ if(str==NULL || strlen(str)==0) return 0; //声韵匹配表 0 表示匹配 ,1 不匹配 short sytable[SMNUM][YMNUM]={{1,1,0,1,1,1,0,1,0,1,1,1,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//b {1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,0,1,1,1,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0},//d {1,0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0}, {1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,0,1,1,1,1,0,0,0}, {1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,0,1,1,1,1,0,0,0}, {1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0},//g {1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0}, {1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,1,1,1,1,1,1},//j {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,1,1,1,1,1,1}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,1,1,1,1,1,1}, {1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0},//zh {1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0}, {1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0}, {0,0,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,0}, {1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0},//z {1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0}, {1,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0}, //{1,0,1,0,1,1,1,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,1,0,0,1,0,1,1,0,0,0},//y //{1,1,0,1,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, }; //声母 char* shengmu[SMNUM]={"b","p","m","f","d","t","n","l","g","k","h","j","q","x","zh","ch","sh","r","z","c","s"}; //韵母 char* yunmu[YMNUM]={"a","o","e","ai","ao","an","ou","ei","er","en","ang","eng","i","ia","ie","iu","in","iao","ian","iang","ing","u","ua","uo","ui","un","uai","uan","uang","ueng","ong","v","ve","ue","vn","van","iong"}; //零声母 char* zeroshengmu[ZEROSMNUM]={"a","o","e","ai","ao","an","ou","ei","er","en","ang","eng","yi","ya","ye","yao","you","yan","yin","yang","ying","wu","wa","wo","wai","wei","wan","wen","wang","weng","yo","yu","yue","yuan","yun","yong"}; // char *p = str; int len = strlen(p); int i=0,k=0,smorder=0,num=0; int flag=0; while((len=strlen(p))>0) { flag=0; //检查是否零声母 for(k=4;k>0;k--) { if(len < k) continue; for(i=0;i<ZEROSMNUM;i++) { if(k != strlen(zeroshengmu[i])) continue; if(strncmp(zeroshengmu[i],p,k)==0) { flag=1; break; } } if(flag==1) break; } if(flag==1) { num++; p = p+k;//检测下一个拼音 len = strlen(p); continue;// } //检查声母 flag=0; for(k=2;k>0;k--) { if(len < k) continue; for(i=0;i<SMNUM;i++) { if(k != strlen(shengmu[i])) continue; if(strncmp(shengmu[i],p,k)==0) { smorder=i;//声母序号 flag=1; break; } } if(flag==1) break; } //存在声母 检查韵母 if(flag==1) { p=p+k; len = strlen(p); if(len<=0) return 0;//不是完整拼音 //检查韵母 flag=0; for(k=4;k>0;k--) { if(len<k) continue; for(i=0;i<YMNUM;i++) { if(k < strlen(yunmu[i])) continue; if(strncmp(yunmu[i],p,k)==0) { if(sytable[smorder][i]==1)//匹配声韵表 { flag=1; break; } } } if(flag==1) break; } if(flag==1) { num++; p = p+k; continue; } else return 0;//不是拼音 } else return 0;//不是拼音 } return num;}
0 0
- C语言 由拼音字串获取拼音数量
- 获取汉语字串的拼音
- C语言获取汉字拼音首字母
- C语言获取汉字拼音首字母
- C语言获取汉字拼音首字母
- C# 获取汉字字串的拼音声母
- iOS开发-C语言获取汉字拼音首字母
- C#_获取汉字拼音
- C#_获取汉字拼音
- sqlServer 中 获取汉字字串的拼音声母
- 返回字串的拼音首字母
- 返回字串的拼音首字母
- 拼音
- 拼音
- C#由汉字获取拼音或者首字母的帮助类
- 汉字拼音及拼音码获取
- php获取字符串拼音和拼音首字母
- Java获取汉字拼音和拼音缩写
- Python3.x和Python2.x的区别
- POJ 2081——Recaman's Sequence
- 【opencv练习15 - 腐蚀膨胀】
- First Missing Positive
- 深入研究JavaScript的事件机制
- C语言 由拼音字串获取拼音数量
- Acute Stroke
- J2SE--线程
- Laravel - DB facade实现CURD
- 集成ijkplayer
- 快速乘/快速幂/矩阵快速幂
- 【opencv练习16 - 形态学运算】
- laravel环境的搭建和配置
- 湖南省第十一届大学生计算机程序设计竞赛 部分题解 待续