- 注册时间
- 2005-8-2
- 最后登录
- 1970-1-1
|
这是在前人的基础上写的一个不成熟全平台的拼音输入函数,调用input之后,返回的汉字在data中,要输入字串,可以自己写一个
用前确保LavaData目录下有pinyin.dic文件- //#define USE_QUEWEI
- //#define USE_EXTRA
- #define PY_MAX 9
- #define NULLCHAR 0
- #define F2_KEY 0x1d
- #define UP_KEY 0x14
- #define DOWN_KEY 0x15
- #define LEFT_KEY 0x17
- #define RIGHT_KEY 0x16
- #define CR_KEY 0x0d
- int Py_begin0,Py_begin1;
- int Py_len[3];
- char Fp_py2gb;
- char Table_py[69],Table_sm[24],Table_ym[133];
- void PY2GB_Init()
- { char ver[5];
- Fp_py2gb= fopen("/LavaData/pinyin.dic","r");
- if(Fp_py2gb==0)
- Fp_py2gb= fopen("/GVMData/pinyin.dic","r");
- fseek(Fp_py2gb,32,0);
- fread(ver,1,4,Fp_py2gb);
- if(strcmp(ver,"1.00")!=0)
- { SetScreen(1);
- printf("Version %s\nError Version!!\n",ver);
- getchar();
- exit(0);
- }
- fseek(Fp_py2gb,50,0);
- fread(Py_len,1,6,Fp_py2gb);
- fread(Table_py,1,Py_len[0]+1,Fp_py2gb);
- fread(Table_sm,1,Py_len[1]+1,Fp_py2gb);
- fread(Table_ym,1,Py_len[2]+1,Fp_py2gb);
- Py_begin0=ftell(Fp_py2gb);
- Py_begin1=Py_begin0+Py_len[0];
- }
- void PY2GB_End()
- {
- fclose(Fp_py2gb);
- }
- int System_QW2GB(long qwc,long buf)
- {
- char gb[4];
- if(strlen(qwc)!=4)
- return -1;
- gb[0]=*(qwc+0)*10+ *(qwc+1)- 368;
- gb[1]=*(qwc+2)*10+ *(qwc+3)- 368;
- gb[2]=NULLCHAR;
- if(gb[0]>160&&gb[1]>160)
- strcpy(buf,gb);
- else
- return -1;
- return gb[0]+(gb[1]<<8);
- }
- long System_PY2GB(int id,long pys,long buf)
- {
- int n0,n1,n2;
- int max,pos,num,len;
- // *buf=NULLCHAR;
- len=strlen(pys);
- if(id<0||len<=0||len>6) return -1;
- /*
- #ifdef USE_QUEWEI
- if(*pys=='v')
- { if(System_QW2GB(pys+1,buf)==-1)
- return -1;
- else
- return 0x00010001;
- }
- #endif
- #ifdef USE_EXTRA
- if(*pys=='u')
- { if(len==2)
- num=*(pys+1);
- else
- if(len==3 && *(pys+1)=='u')
- num=*(pys+2);
- else
- return -1;
- if(num>='a' && num<='z')
- { *buf=163;
- *(buf+1)=32+len*32+num;
- }
- else
- if(num>='1' && num<='9')
- { *buf=162;
- *(buf+1)=24+len*52+num;
- }
- else
- return -1;
- *(buf+2)=NULLCHAR;
- return 0x00010001;
- }
- #endif
- */
- n0=strstr(Table_py,pys);
- if(n0!=0)
- pos=Py_begin0+(n0-Table_py);
- else
- { n1=strchr(Table_sm,*pys);
- if(n1==0) return -1;//声母不存在
- pys++;
- if(*pys==0) return -1;
- else
- if(*pys=='h') { pys++; n1++; }
- n2=strstr(Table_ym,pys);
- if(n2==0) return -1;//韵母不存在
- pos=Py_begin1+(n1-Table_sm)*Py_len[2]+(n2-Table_ym);
- }
- fseek(Fp_py2gb,pos,0);
- fread(&max,1,2,Fp_py2gb);
- if(max==-1||max<=id) return -1;
- fread(&pos,1,2,Fp_py2gb);
- num = max-id;
- if(num>PY_MAX) num=PY_MAX;
- fseek(Fp_py2gb,pos+id*2,0);
- fread(buf,1,num*2,Fp_py2gb);
- *(buf+num*2) = NULLCHAR;
- return num+(max<<16);
- }
- //hanzi[3]用于存放中文变量
- void input(char &hanzi[])
- {
- char i;//标志输入了几个拼音字母
- char group;//第几组
- char present;//光标在第几个
- long n;//py2gb返回值
- char sum;//总汉字数
- char key;//按键
- char str[7];//拼音缓存
- char buf[10][2];//字符缓存
- int result;
- present=4;
- group=0;
- PY2GB_Init(); // 放在首次使用System_PY2GB前
- TextOut(2,68,"拼",65);Box(2,66,14,80,1,2);
- for(i=0;;)
- {
- key=getchar();
- if(islower(key))
- {
- if(i<6){str[i]=key;group=0;}
- str[++i]=0;
- memset(buf,' ',18);
- TextOut(52,68,buf,65);
- n=System_PY2GB(group*9,str,buf);
- present=(n&0xffff)/2;
- }
- else if(key==F2_KEY)
- {
- if(i>0)str[--i]=0;
- memset(buf,' ',18);
- TextOut(52,68,buf,65);
- n=System_PY2GB(group*9,str,buf);
- present=(n&0xffff)/2;
- }
- else if(key==LEFT_KEY)
- {
- if(present>0)present--;
- }
- else if(key==RIGHT_KEY)
- {
- if(present<(n&0xffff-1))present++;
- }
- else if(key==UP_KEY)
- {
- if(group>0)group--;
- memset(buf,' ',18);
- TextOut(52,68,buf,65);
- n=System_PY2GB(group*9,str,buf);
- present=(n&0xffff)/2;
- }
- else if(key==DOWN_KEY)
- {
- if(sum>((group+1)*9)){group++;}
- memset(buf,' ',18);
- TextOut(52,68,buf,65);
- n=System_PY2GB(group*9,str,buf);
- present=(n&0xffff)/2;
- }
- else if(key==CR_KEY)
- {
- memcpy(hanzi,buf[present],2);
- return;
- }
- str[i]=0;
- sum=n>>16;
- TextOut(15,67," ",65);
- TextOut(15,68,str,65); //输出拼音
- TextOut(52,68,buf,65); //输出备选汉字
- if(n==-1)continue;
- Box(52+12*present,68,63+12*present,80,1,2);
- }
- PY2GB_End();// 放在不再需要System_PY2GB后
- }
- void main()
- {
- char data[3];
- input(data);
- printf("%s",data);
- }
复制代码 |
|