栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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].dormNono&&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 %dn",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 %dn",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码为:%dn",name[i],n);
    }
    printf("sum=%dn",sum);
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002264.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号