zoukankan      html  css  js  c++  java
  • 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是替换字符串

  • 相关阅读:
    关于Dubbo和Spring异步注解@Async的冲突
    查看和解除Linux系统对用户使用资源的限制
    Spring 邮件发送
    分布式一致性哈希算法
    Java实现三大简单排序算法
    Java二维码生成与解码
    第三方支付之微信支付(扫码支付)
    第三方支付之支付宝(电脑网站支付)
    集成第三方开放平台
    Spring动态数据源实现读写分离
  • 原文地址:https://www.cnblogs.com/someblue/p/3622851.html
Copyright © 2011-2022 走看看