| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1327 人关注过本帖
标题:关于汉字字符串的一些问题与疑惑
只看楼主 加入收藏
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
结帖率:86.67%
收藏
已结贴  问题点数:20 回复次数:9 
关于汉字字符串的一些问题与疑惑
程序代码:
#include<stdio.h>
main()
{
    char a[3]="";
    printf("%c%c\n",a[0],a[1]);
    printf("%d %d\n",a[0],a[1]);
    unsigned int i=a[1];
    int j=a[0];
    printf("%u  %d\n",a[1],a[0]);
    printf("%d  %d\n",i,j);
  
    char b[2]="2";
    printf("%u\n",b[0]);
}
如上程序所示,
问题一:printf("%c%c\n",a[0],a[1]);这个是我在本论坛上找到的,居然这样能够输出一个汉字,不知道谁能解释下?我有点不能理解

问题二:printf("%d %d\n",a[0],a[1]);为什么输出的是负数?

问题三:关于汉字的字符的话,应该涉及到了Unicode了吧,我网上查了下一的unicode编码十进制为19968,请问我能否在程序中输出任意汉字的编码??如何得出汉字的编码?

问题四:问题一中的printf("%c%c\n",a[0],a[1]);中将%c%c改为%c %c的话输出了两个??问号,请问这个怎么回事,能解释下吗?

问题五:printf("%u  %d\n",a[1],a[0]);为什么我用无符号整型输出a[1]时输出的是4294967227,这个数字非常大,已经超出了无符号整型的范围了吧,请问怎么回事,是错误吗?我自己对问题五我写了 char b[2]="2";printf("%u\n",b[0]);这个无汉字的测试,这个没有问题啊!

希望能够分别回答,不然会搞不清楚的!谢谢合作!
搜索更多相关主题的帖子: 汉字 字符 
2010-05-18 18:35
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:2 
因为汉字是Unicode编码的,Unicode编码的字符是由两个字节组成的,所以printf("%c%c\n",a[0],a[1]);要打印出两个字节才能显示出正确的内容。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-05-18 18:45
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
收藏
得分:9 
A1:一个汉字2个字节 一个字符是1个字节
A2:printf("%d %d\n",(unsigned char)a[0],(unsigned char)a[1]);
A3:C/C++不支持Unicode,用的是ASCII,但是可以获取GB2312编码。
A4:在问题一得答案里已经告诉你了,一个汉字占2个字节  你想把一个汉字一半一半的输出时不可能的。所以给你的是??
A5:int的范围是-2^31~2^31  而unsigned  int范围是-2^32~2^32(4394967296)
#include <stdio.h>
#include <string.h>
int main()
{
    char S[2];
    int  a,b;
    while(1)
    {
        printf("请输入一个汉字:");
        scanf("%s",S);
        a=(unsigned char)S[0],b=(unsigned char)S[1];
        printf("%d %d\n",a,b);
        printf("%c%c\n",a,b);
        printf("%s\n",S);
    }
    return 0;
}

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-18 19:05
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
关于问题一,我知道一个汉字两个字符的,如果说printf("%s\n",a);输出一的话我当然能够理解,就是问什么%c%c连在一起输出就是一个汉字了呢?我不理解的就是为什么%c%c一起就可以输出一来了?
问题二:printf("%d %d\n",(unsigned char)a[0],(unsigned char)a[1]);这个输出的是210 187 是什么的值,是unicode的吗?
问题三:那如何获取GB2312编码?


[ 本帖最后由 wingfeng 于 2010-5-18 19:24 编辑 ]
2010-05-18 19:21
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
收藏
得分:8 
printf("%s\n",a);等价于:
for(i=0;a[i]!='\0';i++)
    printf("%c",a[i]);//没有空格
printf("\n");
现在明白了?
自己看我给的程序 程序中的a b的值就是高、低位的GB2312编码。

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-18 19:28
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 

大部分明白了。原来C/C++不支持Unicode,我对这些编码不了解,那c/c++支持哪些编码??就ASCII和GB2321?(问题问的有点怪,别介意!)
2010-05-18 19:48
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
收藏
得分:1 
还包括 ISO-8859、GBK、BIG-5、SHIFT-JIS、 UTF-8等等  

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-18 19:55
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
回复 7楼 NoSoul
这么多啊,我都没有碰到过的样子,那些都是怎么用的啊??能介绍一个吗?
2010-05-18 20:11
NoSoul
Rank: 9Rank: 9Rank: 9
来 自:沈阳化工大学
等 级:蜘蛛侠
帖 子:283
专家分:1010
注 册:2009-6-6
收藏
得分:0 
我用的最多也就是 ASCII和GB2321了  其他的我也没用过 - -

我想伸手拉近點,竟觸不到那邊,就欠一點點,但這一點點...卻好遠
2010-05-18 20:23
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
回复 9楼 NoSoul
这样啊,呵呵,谢谢了!
2010-05-18 21:42
快速回复:关于汉字字符串的一些问题与疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033699 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved