• 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是替换字符串

  • 相关阅读:
    关于JS的Date对象的探究
    讲解跨域---凭空多出来的一次请求?
    时间format函数引爆的知识点和年末有话说
    再不写篇博客感觉就凉了
    关于after和before
    怎么在Vue中使用Base64格式的背景
    Vue入门
    前端实现Tab切换栏
    死锁和约束(四)
    Java ClassLoad详解
  • 原文地址:https://www.cnblogs.com/someblue/p/3622851.html
Copyright © 2020-2023  润新知