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
原创粉丝点击