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

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

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

主要原理:

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

程序优点:

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

程序缺点:

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

源代码:

/*--------------------------------------------------------------------------
* 项目名称 :简易拼音输入法
* 程序名称 :主程序
* 项目组织 :云飞工作室
* 程序编写 :戴晓天
* 邮  箱 :automatic.dai@gmail.com
* 版  本 :V0.1.111124(beta)
----------------------------------------------------------------------------
* 程序说明 :
 本程序利用建立索引的方法实现了简单的拼音输入法。
  目前仅支持a、b开头的拼音码,可以自行扩展。
----------------------------------------------------------------------------
* 修订说明 :
  暂无修订。
--------------------------------------------------------------------------*/
#include "stdio.h"
#include "string.h"
#include "conio.h"

typedef struct _PY_Index
{
     char *_PyMa;       // 存放拼音的拼音码
     char *_PYTable;    // 对应的中文汉字表
}PY_Index;
PY_Index PY_Ma_Talbe[] = {
    {"a"    ,"阿啊嗄呵锕吖腌錒"},
    {"ai"   ,"哎爱唉碍哀埃挨矮蔼皑癌艾隘暧"},
    {"an"   ,"按安案暗俺岸胺氨庵"},
    {"ang"  ,"昂盎肮醃醠枊肮岇骯卬"},
    {"ao"   ,"奥澳傲懊熬袄凹敖翱"},

    {"b"    ,"不把吧爸必"},
    {"ba"   ,"把吧爸巴拔八"},
    {"bai"  ,"白百佰柏摆败拜稗"},
    {"ban"  ,"办半搬板伴"},
    {"bang" ,"棒帮榜镑蚌"},
    {"bao"  ,"包宝饱报抱保苞胞褒雹堡豹鲍暴爆剥薄瀑"},
    {"bei"  ,"被北倍杯备背卑悲碑贝狈钡惫焙辈"},
    {"ben"  ,"本奔苯笨夯"},
    {"beng" ,"崩绷甭迸蹦泵"},
    {"bi"   ,"必毕闭鼻比彼笔币避鄙逼庇毖陛毙敝痹蓖弊碧蔽壁臂"},
    {"bian" ,"边编鞭贬扁卞便变遍辨辩辫"},
    {"biao" ,"彪标膘表"},
    {"bie"  ,"憋鳖别瘪"},
    {"bin"  ,"宾斌彬滨鬓濒摈"},
    {"bing" ,"冰丙并病秉柄炳饼兵"},
    {"bo"   ,"拨波玻钵脖菠播伯驳帛泊勃铂舶博渤搏箔膊卜"},
    {"bu"   ,"不补哺捕布步怖部埠簿"},

    {NULL   ,NULL}
};
/*
********************************************************************
*函数名称 : PY_Search() 
*入口参数 : char *pPyMa         // 待查找的拼音码
*出口参数 : 无
*返回参数 : char *pTable        // 查找到的汉字码
*程序编写 : 戴晓天
*版    本 : V1.0.111124
*说    明 :
     在索引表中搜索待查找的拼音码,返回对应的汉字码起始地址。
********************************************************************
*/
char *PY_Search(char *pPyMa)
{
    char *pTable;
    int i;

    for ( i = 0; PY_Ma_Talbe[i]._PyMa!= NULL ;i++ )
    {
        if ( strcmp(pPyMa, PY_Ma_Talbe[i]._PyMa) == 0 )
        {
            break;
        }
    }

    // 注意此时如果没有找到,._PYTable为NULL
    pTable = PY_Ma_Talbe[i]._PYTable;  
    return pTable;
}
////////////////////////////////////////////////////////////////////////////////////////
// 主程序
int main(int argc, char* argv[])
{
    char chPYInput[10];     // 输入的拼音码
    char chPYIndex;         // 输入拼音码的索引
    char chInChar;          // 每次输入的字符
    char *PYString;         // 对应的汉字码表
    char chPYMaResult[2+1]; // 最后确定选择的汉字,中文占两个字节

    printf("请输入要查找的字符(只支持a、b开头):\n");
    memset(chPYInput,0,10);
    chPYIndex = 0;
    while (1)
    {
        chInChar = getch();

        // 如果是字母
        if ( chInChar >='a' && chInChar <= 'z' )         {             chPYInput[chPYIndex++] = chInChar;                         PYString = PY_Search(chPYInput);    // 这里输入要查找的字符             if ( PYString != NULL)             {                 printf(chPYInput);                 printf(PYString);                 printf("\n");             }             else             {                 printf("The PY code you input is not exist!\n");                 getch();                 return 0;             }         }         // 如果是退格键         else if ( chInChar == '\b' )         {             chPYInput[--chPYIndex] = 0;             PYString = PY_Search(chPYInput);    // 这里输入要查找的字符             if ( PYString != NULL)             {                 printf(chPYInput);                 printf(PYString);                 printf("\n");             }             else             {                 printf("The PY code you input is not exist!\n");                 getch();                 return 0;             }         }                 // 如果是数字键,则表示选择了对应的汉字         else if ( chInChar >= '0' && chInChar <= '9')         {             unsigned int index;             index = ( (chInChar-'0') * 2 ); // 汉字索引为偏差值*2,因为汉字一位是两个字节             // 如果还没有找到汉字表,或者索引超出了汉字表的最大索引,则什么都不做             if ( PYString == NULL ||  index > strlen(PYString)-1 )
            {
                ;
            }
            // 否则说明找到了正确的汉字,将其拷贝到内存变量中
            else
            {
                memcpy(chPYMaResult ,&PYString[index], 2);
                chPYMaResult[2] = '\0'; // 别忘了加上\0,否则打印时会出错
                break;
            }

        }

    }
   
    printf("你输入的字符是:%s\n", chPYMaResult);
    getch();

    return 0;
}

Cpp文件下载:

PYInput

%d bloggers like this: