C语⾔处理中⽂字符,C语⾔中关于汉字的处理
学习过C语⾔的⼈也许有时会遇到这样⼀个问题:如何⽤变量存储汉字以及对这些变量进⾏操作。⽬前许多C语⾔参考书中都没涉及到这个问题,程序中多为处理英⽂变量和英⽂字符串,涉及到汉字的情况也⼤都是在printf语句中输出提⽰信息或结果,如:
printf("请输⼊a,b的值:\n");
printf("输出功率为%s千⽡。\n",power);
考虑到还有相当⼀部分⼈在学习和应⽤C语⾔,因此在这⾥向读者介绍⼀下笔者在这⽅⾯摸索出来的经验。
存储汉字应该⽤字符数组,这⼀点是肯定的,关键问题是汉字在你的计算机系统上占⼏个字节。多数⼈会认为⼀个汉字肯定占两个字节,其实不然。汉字到底占⼏个字节,这是随系统不同⽽不同的,⽽且还依赖于软件环境,如Visual Basic中汉字占⼀个字节。可以在你的计算机上⽤strlen()函数测试⼀下,如:
printf("%d",strlen("计算机"));
若输出为6,则每个汉字占两个字节;若输出12,则每个汉字占四个字节。⼤多数系统是每个汉字占两
个字节的,即上述语句输出值为6。应当注意的是⼀个全⾓字符(包括标点符号)同汉字占据相同的字节。本⽂假定每个汉字占两个字节。这样你就可以⽤字符数组存储汉字了,但别忘了,由于C语⾔中字符串是以'\0'作为结束标记的,系统会⾃动加上这个标记符,⽽⽤strlen()函数测试的返回值不包括这个'\0',因此在定义和初始化字符数组时应当使数组长度最⼩为实际字符串长再加1,如:
static char name[7]="孙悟空";
如果把数组长度定义为6,系统在编译时并不报错,但是当运⾏程序时有时会莫名其妙地重复输出或多输出汉字,如果出现这种情况,应当⾸先考虑数组长度是否有问题。当然在定义的同时初始化可以省略数组长度,如:
static char array[]={"中国计算机软件专业技术⽔平考试"};
同样可以定义⼆维数组,下⾯这个⼆维数组可以存放10个⼈名:
char member[10][8];
因为⼆维数组member[10][8]可以看成特殊的⼀维数组member[0],member[1],…,member[9],这些⼀维数组分别表⽰各⾏,⽽⼀⾏就表⽰了⼀个⼈名,因此如果想操作每个⼈名,只需写成member[0],member[1],…⽽不写成member[0][8],member[1][8],…。
顺便提⼀下,在C编译窗⼝中输⼊汉字需要中⽂环境。如果读者⽤的是DOS操作系统,那么就需要安装CCDOS或UCDOS;如果是
WIN95/98操作系统,则在DOS命令窗⼝中运⾏下⾯这个批处理⽂件即可,⽽不必另外安装中⽂DOS系统:
C:\WINDOWS>PDOS95
在C编辑窗⼝中⽤Ctrl+空格键启动WIN95中⽂输⼊法。另外由于C程序是基于DOS的,因此编辑、编译C程序最好在全屏幕状态,否则容易出现问题。
下⾯给出⼀个实例程序,它的功能是计算出输⼊年份的天⼲地⽀。
#include "string.h"
voidmain()
{
inta,b,year;
chargz[6];
staticchartg[10][3]={"甲","⼄","丙","丁","戊","⼰","庚","⾟","壬","癸"};
staticchardz[12][3]={"⼦","丑","寅","卯","⾠","巳","午","未","申","⾣","戍","亥"};
printf("请输⼊⼀个年份:");
scanf("%d",&year);
a=(year-1804)%10;
b=(year-1804)%12;
strcpy(gz,tg[a]);
c语言中文网汇编语言strcat(gz,dz);
printf("%d年的⼲⽀为:%s\n",year,gz); }
运⾏结果:
请输⼊⼀个年份:1999
1999年的⼲⽀为:⼰卯