前言:在站里看到许多关于这个问题的文章,都大差不差,但基本用的java语言,且讲述原理的过程比较繁琐、晦涩,不适于c语言初学者。文中涉及到区位码、国标码、机内码的转换,可跳过。
解该题目需要一定的计算机基础,我们在这里用通俗易懂的文字、代码,来给大家讲解这一问题。
正文:我们知道,汉字(包括中文符号、全角符号)在内存中存储需要两个字节,而汉字是遵循国标码标准用机内码存储于内存中的。国标码化为机内码需要两个字节分别加上(80 80)H,在这里我们跳过这一步直接将区位码加上(A0 A0)H.
汉字的区位码转换为十六进制后,两个字节分别加上(A0 A0)H,此时不论该汉字的区位码是多少,它的最高位是大于等于A的,转化为二进制时它的最高位是等于1的,而在C语言中,一个字节的最高位代表符号位,若符号位为1则该字节存储的数为负数(符号位1代表负数,0代表正数)。
(过程可跳过,了解原理即可)
转换过程及计算:例如某汉字的区位码为19 34(前两数代表区,后两位代表位)
我们将它分别化为十六进制:(13 22)H
然后分别加上(A0 A0)H: (B3 C2)H,此时这个数就是机内码了。
最后将该数转化为二进制:10110011 11000010
我们可以看到两个字节的最高位分别为1.
我们用C语言代码来实现:
#include"stdio.h"
void main(){
char s[99]={'\0'}; //定义字符数组,这里初值也可不赋。
int i=0,j=0; //定义j为汉字个数,赋初值为0.
gets(s); //输入字符串到a数组。
while(s[i])
if(s[i++]<0&&s[i]<0) //判断当前元素以及下一个(i++将下标下移一次)元素最高位是否为1
i++,j++; //如果符合汉字的条件,则下标再下移一次。
printf("%d",j);}
运行结果为: