C 汉字处理

好像有个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是替换字符串

原文地址:https://www.cnblogs.com/someblue/p/3622851.html