C语言中关于中文字符的存储及相关探索

(划到最下可直接看总结)

因为课设要做一个宿舍管理查询程序,基本要求中有按姓名查询,即输入一个姓名,按姓名找到对应的学生及其信息,算法要求使用折半查找。

int BinarySearch(SeqList myList,int no,int choice){//折半查找

    //对顺序表进行冒泡排序,排序方式由choice选择(姓名、学号、房号)
    myList= BubbleSort(myList, len(myList),choice); 

    int low=0,high=myList.size-1;
    int mid;

    while(low<=high){
        mid=(low+high)/2;
        if( (myList.list[mid].dormNo==no&&choice==3) ||
                (myList.list[mid].stuNo==no&&choice==2) ){
            return mid;
        }else if( (myList.list[mid].dormNo<no&&choice==3) ||
                (myList.list[mid].stuNo<no&&choice==2) ){
            low=mid+1;
        }else if( (myList.list[mid].dormNo>no&&choice==3) ||
                (myList.list[mid].stuNo>no&&choice==2) ){
            high=mid-1;
        }
    }
    return -1;
}

由于形参int no已经被我定下来实现学号和房号的查找了,我也不想再多写一个查找函数,这样显得比较冗余,所以对于姓名的处理,我首先想到的是,取出姓名对应的ASCII来实现。

于是我开始查找相关解决办法,查了许久终于找到了两个相关文章,开始了对中文字符存储情况的探索.....

查到的两篇文章分别如下,非常感谢前辈们的记录!!

在C语言中,怎么将汉字转换成ascii码,请举例说明_ddkxddkx的博客-CSDN博客_c语言中汉字的ascii码C语言中两位ASCII码可以表示汉字 - 星云博客园 - 博客园

第一位前辈说,汉字不能表示成ASCII码,简体汉字一般用GB2312存储,占用两个char位置。

测试代码如下:

void main() {
    char chn[3]; //第三个存储'/0'
    scanf("%s",chn); //这里输入一个汉字
    printf("%d %d\n",chn[0]&0xFF,chn[1]&0xFF);
    //输出对应的数字,与0xff做且运算是为了保证输出正数
}

我输入了一个“我”字进去,对应的输出为:230 136

这样看来,一个中文字符确实占用了两个char,然而,当我尝试用获得数字逆推中文字符时......

void main() {
    char test[3];
    test[0]=230;
    test[1]=136;
    test[2]=0;
    puts(test);
}

控制台给我打了个:

???我懵了,why?

我尝试打印第三个位置的元素(即chn[2]),发现......第三个位置竟然有值!!?

(输入的还是“我”字)对应的输出为:230 136 145

void main() {
    char chn[3];
    scanf("%s",chn); //这里输入一个汉字
    printf("%d %d %d\n",chn[0]&0xFF,chn[1]&0xFF,chn[2]&0xFF);
    //输出对应的数字,与0xff做且运算是为了保证输出正数
}

于是,我扩展了chn的容量,继续测试:

这和说好的不一样啊!一个中文字符占了三个char......为啥啊?后来我查到 :UTF-8 编码中,一个英文字母为一个字节,一个中文为三个字节。俺也不知道,俺也不晓得啊,不过这也不影响我们继续进行探索。

将前面漏掉的145加上,这样就可以puts出来啦:

如果不将char类型数组中的元素与0xff做且运算,那会输出什么?答案是,负数

而且都是与256的关系(来自第二篇博客前辈们的提醒

将对应的负数存进数组,也可以puts出来相同的结果:

写到这里,想得出中文字符的ASCII码应该是不太可能了,不过我也许可以对各个中文字符通过以上探索得出的对应的各个数字做一些处理,来得到每个名字的关键字~~~

这是我之前写的转ascii码函数,我一开始就是通过它发现转出的中文字符的码不对劲,然后开始查资料的。截图附上,这个函数用来转英文字母和一些符号、数字啥的应该没啥问题。

void tranToAscii(char name[10]){
    int sum=0;
    for (int i=0;i<10;i++){
        int n=name[i];
        sum=sum+name[i];
        printf("%c的ascii码为:%d\n",name[i],n);
    }
    printf("sum=%d\n",sum);
}

更新:

中文字符的存储占用几个字节,其实和选择的文件编码格式有关,如:用utf-8编码文件,那么中文字符就占三个字节。

 改成gbk后,中文字符就占两个字节了

总结:

1、c语言 存储 汉字不能表示成ASCII码,其存储形式由文件编码格式决定。

2、在utf-8编码中,一个中文字符占三个字节。而在gbk编码中,一个中文字符占两个字节。

3、直接得到的 中文字符的三个数字编码 是负的 与0xff做且运算,能得到正数。

4、256是个特殊的数字,256 + (-26) == -26 & 0xff ,其中-26为中文字符的一个数字编码。

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值