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为中文字符的一个数字编码。
C语言中关于中文字符的存储及相关探索相关推荐
- c语言中文网_在C语言中使用中文字符
大部分C语言教材对中文字符的处理讳莫如深,甚至只字不提,导致很多初学者认为C语言只能处理英文,而不支持中文.其实C语言是一门全球化的编程语言,它支持世界上任何一个国家的语言文化,包括中文.日语.韩语等 ...
- c语言中的编程英文怎么看,在C语言中使用英文字符
前面我们多次提到了字符串,字符串是多个字符的集合,它们由" "包围,例如"http://c.biancheng.net"."C语言中文网". ...
- 解决Python3中的中文字符编码的问题-亲测有效
解决Python3中的中文字符编码的问题 一.原理篇: Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等.这篇文章主要介绍了Python3中的解决中文字符编 ...
- C语言中字符串和字符数组的区别
C语言中字符串和字符数组的区别 1.基本概念 2.代码分析 3.总结 1.基本概念 字符串和字符数组很相似,但是有本质上的区别. (1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自 ...
- python django mysql写入中文乱码_解决django 向mysql中写入中文字符出错的问题
之前使用django+mysql建立的一个站点,发现向数据库中写入中文字符时总会报错,尝试了修改settings文件和更改数据表的字符集后仍不起作用.最后发现,在更改mysql的字符集后,需要重建数据 ...
- java a标签正则_正则表达式:java中婚配HTML中a标签中的中文字符
正则表达式:java中匹配HTML中a标签中的中文字符 今天群里一位朋友问到了一个正则表达式的问题,有如下内容: 特432 453543 a1特123你好123吗? 特2 标签中的文字现在要匹配出内容 ...
- 发送附件时,防止文件名中的中文字符变成乱码
在.net2005中,利用System.Net.Mail;下的MailMessage类发送邮件,为了防止附件文件名中的中文字符变成乱码,需要加attachment.NameEncoding = Enc ...
- 正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码
目录 1.乱码符号种类较少,用replace() 2.乱码字符种类较多,用re.sub() 3.提取字符串中的中文字符 4.提取字符串中的中文字符和数字 5.提取其他 数据清洗的时候一大烦恼就是数据中 ...
- 解决在全文搜索中搜索中文字符
解决在全文搜索中搜索中文字符出错补丁:点击下载 http://www.artbbs.net/Demo/Dvbbs_Help/Help_Img/SQLx86.rar 解决中文字符出错问题: 方法一: 把 ...
- mysql向表中插中文显示,针对mysql数据库无法在表中插入中文字符的解决方案(彻底解决jav...
针对mysql数据库无法在表中插入中文字符的解决方案(彻底解决jav 针对mysql数据库无法在表中插入中文字符的解决方案(彻底解决:java.sql.SQLException: Incorrect ...
最新文章
- Api 函数: GetCursorPos 与转换
- vue - blog开发学习6
- 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数
- 文件存储的原理和记事本打开文件的原理
- 解决火车票网上订票难的方案
- mysql error1045 yes,MySQLERROR1045(28000)错误的解决办法
- java 局部变量空间 大小_变量作用域-1:局部变量 和成员变量、各种变量内存分配的大小...
- sharepoint2013列表实现项目级权限控制
- Perl连接Oracle数据库的一些操作脚本【转】
- loadrunner ftp linux,loadrunner ftp协议使用详细步骤
- 我喜欢用计算机400字,我喜欢电脑画画作文400字
- 谷歌浏览器启动页被篡改为hao.7654.com的解决办法
- 入夏短裤热 教你怎么穿
- 2018上半年最火的微信公众号有哪些?
- 【Java基础】Java综合练习
- WPS表格转换成Excel用什么方法
- 圣科车衣,给予您的爱车完美守护
- Elasticsearch重建索引
- Access时间日期比较查询的方法
- 微信支付-vue 实现微信支付-前端篇
热门文章
- sop流程图模板_标准作业流程SOP详解,附流程图绘制规范,不愁不会画!
- Android开发:引入重复包报错Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDe...’解决方法
- CAD绘制固定矩形批注(网页版)
- Visio如何裁剪图片
- 由于您的系统没有安装html help,教你解决Chrome浏览器未安装flash控件方法
- 经纬度坐标转换的方法
- 2018DeeCamp面试问答
- 单片机IO口科普:推挽输出、开漏输出详解
- 美国小学计算机编程课程,美国小学STEM课程案例研究
- pytorch 学习笔记 part14 过拟合欠拟合及解决方案