好像有个wchar_t类型的,这里不深究了,只研究char型(1个字符大小)的
1.定义
直接使用char,但每个汉字占据2个字符,所以必须以字符串形式存在
char s[10];
2.定义时直接赋值
和基本类型相同,如 char s[10]="汉字"
3.输出
整个字符串输出
printf("%s",s);
cout<<s<<endl;
单个汉字字符输出
这里有点考究了
如果printf("%c",s[0]); 会输出一个问号
合适的方法应该是printf("%c%c",s[0][1]);
4.输入
整个字符串的输入
和之前一样使用 scanf("%s",s); cin>>s;
单个汉字字符的输入
这里的输入和以往的不同.
如果是scanf("%c",s[0]); 结果字符串相应的那个汉字会变成一个奇怪的其他字符,而不是自己输入那个字符
合适的方法应该是输入 scanf("%c%c",s[0],s[1]);
5.原因与分析
为什么会有这样的差别。自己推测原因如下(由于时间不充足就不做严格的证明了)
汉字的编码区中,存储单元上两个字节都是负数。所以系统在输出汉字字符串的时候先检测这个字节是否负数,如果是负数则要连同下一个字节,并合成一个有两字节长度的字符来输出,由此产生出了我们的汉字。那么输入的时候,则把用户输入的汉字,拆分为两个字符,然后分别放在参数列表指定的位置上,即例如到了 scanf("%c%c",s[0],s[1]);这个命令的时候,用户输入了一个“汉”字,然后“汉”拆分成了两个字符,第一个是“汉”的高八位,第二个是“汉”的低八位,然后分别放进了s[0]和s[1]中.
6.在代码中修改单个汉字
s[0]="中" 这种方法是显然行不通的,而对字符串又不能使用位移操作符来获取高八位低八位
最纠结的问题,搜寻许久无果,然后产生了原因分析,根据原因找到了改进的方法
使用strncpy()函数,头文件包含在string.h
例如要修改s中第一个字符
strncpy(s,"中",2); 这样就成功了
可以写一个宏定义函数
#define Chcpy(s,pos,t) strncpy(s+pos,t,strlen(t))
s是被替换的字符串,pos是替换的起始位置,t是替换字符串