【C语言】简易拼音输入法

  版权信息:
● 本博客使用CC 3.0协议,转载请保留该信息。
● 原文作者: 戴晓天 @ 云飞机器人实验室
● 原文地址: 【C语言】简易拼音输入法

Automatic.dai : 之前在Ourdev论坛上看到有人用C51设计了拼音输入法,代码还没有看,但是对于其实现原理很感兴趣,所以自己简单尝试了一下。

主要原理:

建立一张汉字索引表,主键为拼音,如”bao”,内容为汉字码表,如”包宝饱报抱保苞胞褒雹堡豹鲍暴爆剥薄瀑”。根据用户输入的拼音去查找对应的汉字码表,之后再根据用户输入的数字输出对应的汉字。这种方式很像LUA的table数据结构,用LUA写这个程序会简单很多,之后我会尝试用LUA写一个版本。

程序优点:

索引为拼音字符串的指针,检索阶段不涉及具体汉字,速度快、原理简单。

程序缺点:

因为只是一个演示程序,这个程序还存在不少缺点。比如使用顺序方式查找,效率低,并且越在表后的数据,检索的速度就越慢。要解决这个问题,可以使用二次查找的方法加快速度,即首先查找‘b’,之后直接散转查找’b’开头的拼音 ”ba”, ”ban”, ”bang” 等。这还需要建立一张映射表,读者可自行尝试。

源代码:

<br />
/*--------------------------------------------------------------------------<br />
* 项目名称 :简易拼音输入法<br />
* 程序名称 :主程序<br />
* 项目组织 :云飞工作室<br />
* 程序编写 :戴晓天<br />
* 邮  箱 :automatic.dai@gmail.com<br />
* 版  本 :V0.1.111124(beta)<br />
----------------------------------------------------------------------------<br />
* 程序说明 :<br />
 本程序利用建立索引的方法实现了简单的拼音输入法。<br />
  目前仅支持a、b开头的拼音码,可以自行扩展。<br />
----------------------------------------------------------------------------<br />
* 修订说明 :<br />
  暂无修订。<br />
--------------------------------------------------------------------------*/<br />
#include &quot;stdio.h&quot;<br />
#include &quot;string.h&quot;<br />
#include &quot;conio.h&quot;</p>
<p>typedef struct _PY_Index<br />
{<br />
     char *_PyMa;       // 存放拼音的拼音码<br />
     char *_PYTable;    // 对应的中文汉字表<br />
}PY_Index;<br />
PY_Index PY_Ma_Talbe[] = {<br />
    {&quot;a&quot;    ,&quot;阿啊嗄呵锕吖腌錒&quot;},<br />
    {&quot;ai&quot;   ,&quot;哎爱唉碍哀埃挨矮蔼皑癌艾隘暧&quot;},<br />
    {&quot;an&quot;   ,&quot;按安案暗俺岸胺氨庵&quot;},<br />
    {&quot;ang&quot;  ,&quot;昂盎肮醃醠枊肮岇骯卬&quot;},<br />
    {&quot;ao&quot;   ,&quot;奥澳傲懊熬袄凹敖翱&quot;},</p>
<p>    {&quot;b&quot;    ,&quot;不把吧爸必&quot;},<br />
    {&quot;ba&quot;   ,&quot;把吧爸巴拔八&quot;},<br />
    {&quot;bai&quot;  ,&quot;白百佰柏摆败拜稗&quot;},<br />
    {&quot;ban&quot;  ,&quot;办半搬板伴&quot;},<br />
    {&quot;bang&quot; ,&quot;棒帮榜镑蚌&quot;},<br />
    {&quot;bao&quot;  ,&quot;包宝饱报抱保苞胞褒雹堡豹鲍暴爆剥薄瀑&quot;},<br />
    {&quot;bei&quot;  ,&quot;被北倍杯备背卑悲碑贝狈钡惫焙辈&quot;},<br />
    {&quot;ben&quot;  ,&quot;本奔苯笨夯&quot;},<br />
    {&quot;beng&quot; ,&quot;崩绷甭迸蹦泵&quot;},<br />
    {&quot;bi&quot;   ,&quot;必毕闭鼻比彼笔币避鄙逼庇毖陛毙敝痹蓖弊碧蔽壁臂&quot;},<br />
    {&quot;bian&quot; ,&quot;边编鞭贬扁卞便变遍辨辩辫&quot;},<br />
    {&quot;biao&quot; ,&quot;彪标膘表&quot;},<br />
    {&quot;bie&quot;  ,&quot;憋鳖别瘪&quot;},<br />
    {&quot;bin&quot;  ,&quot;宾斌彬滨鬓濒摈&quot;},<br />
    {&quot;bing&quot; ,&quot;冰丙并病秉柄炳饼兵&quot;},<br />
    {&quot;bo&quot;   ,&quot;拨波玻钵脖菠播伯驳帛泊勃铂舶博渤搏箔膊卜&quot;},<br />
    {&quot;bu&quot;   ,&quot;不补哺捕布步怖部埠簿&quot;},</p>
<p>    {NULL   ,NULL}<br />
};<br />
/*<br />
********************************************************************<br />
*函数名称 : PY_Search() <br />
*入口参数 : char *pPyMa         // 待查找的拼音码<br />
*出口参数 : 无<br />
*返回参数 : char *pTable        // 查找到的汉字码<br />
*程序编写 : 戴晓天<br />
*版    本 : V1.0.111124<br />
*说    明 :<br />
     在索引表中搜索待查找的拼音码,返回对应的汉字码起始地址。<br />
********************************************************************<br />
*/<br />
char *PY_Search(char *pPyMa)<br />
{<br />
    char *pTable;<br />
    int i;</p>
<p>    for ( i = 0; PY_Ma_Talbe[i]._PyMa!= NULL ;i++ )<br />
    {<br />
        if ( strcmp(pPyMa, PY_Ma_Talbe[i]._PyMa) == 0 )<br />
        {<br />
            break;<br />
        }<br />
    }</p>
<p>    // 注意此时如果没有找到,._PYTable为NULL<br />
    pTable = PY_Ma_Talbe[i]._PYTable;  <br />
    return pTable;<br />
}<br />
////////////////////////////////////////////////////////////////////////////////////////<br />
// 主程序<br />
int main(int argc, char* argv[])<br />
{<br />
    char chPYInput[10];     // 输入的拼音码<br />
    char chPYIndex;         // 输入拼音码的索引<br />
    char chInChar;          // 每次输入的字符<br />
    char *PYString;         // 对应的汉字码表<br />
    char chPYMaResult[2+1]; // 最后确定选择的汉字,中文占两个字节</p>
<p>    printf(&quot;请输入要查找的字符(只支持a、b开头):\n&quot;);<br />
    memset(chPYInput,0,10);<br />
    chPYIndex = 0;<br />
    while (1)<br />
    {<br />
        chInChar = getch();</p>
<p>        // 如果是字母<br />
        if ( chInChar &gt;='a' &amp;&amp; chInChar &lt;= 'z' )         {             chPYInput[chPYIndex++] = chInChar;                         PYString = PY_Search(chPYInput);    // 这里输入要查找的字符             if ( PYString != NULL)             {                 printf(chPYInput);                 printf(PYString);                 printf(&quot;\n&quot;);             }             else             {                 printf(&quot;The PY code you input is not exist!\n&quot;);                 getch();                 return 0;             }         }         // 如果是退格键         else if ( chInChar == '\b' )         {             chPYInput[--chPYIndex] = 0;             PYString = PY_Search(chPYInput);    // 这里输入要查找的字符             if ( PYString != NULL)             {                 printf(chPYInput);                 printf(PYString);                 printf(&quot;\n&quot;);             }             else             {                 printf(&quot;The PY code you input is not exist!\n&quot;);                 getch();                 return 0;             }         }                 // 如果是数字键,则表示选择了对应的汉字         else if ( chInChar &gt;= '0' &amp;&amp; chInChar &lt;= '9')         {             unsigned int index;             index = ( (chInChar-'0') * 2 ); // 汉字索引为偏差值*2,因为汉字一位是两个字节             // 如果还没有找到汉字表,或者索引超出了汉字表的最大索引,则什么都不做             if ( PYString == NULL ||  index &gt; strlen(PYString)-1 )<br />
            {<br />
                ;<br />
            }<br />
            // 否则说明找到了正确的汉字,将其拷贝到内存变量中<br />
            else<br />
            {<br />
                memcpy(chPYMaResult ,&amp;PYString[index], 2);<br />
                chPYMaResult[2] = '&#92;&#48;'; // 别忘了加上&#92;&#48;,否则打印时会出错<br />
                break;<br />
            }</p>
<p>        }</p>
<p>    }<br />
   <br />
    printf(&quot;你输入的字符是:%s\n&quot;, chPYMaResult);<br />
    getch();</p>
<p>    return 0;<br />
}<br />

Cpp文件下载:

PYInput

%d bloggers like this: