| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8507 人关注过本帖
标题:将char型数组里的汉字识别出来,保存到另一个char型数组里,请教怎么实现?
只看楼主 加入收藏
andrewkewang
Rank: 2
等 级:论坛游民
帖 子:44
专家分:42
注 册:2013-11-22
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:9 
将char型数组里的汉字识别出来,保存到另一个char型数组里,请教怎么实现?
现在有这样一个char型的数组:
char buf[] = "张三 (1,2)"
或者
char buf[] = "(1,2) 张三"
(数组里面只会出现“汉字”,“阿拉伯数字”,“逗号”,“圆括号”这四种类型的数据)

怎么把buf数组里的汉字单独提取出来,存储到另外一个char buf2[]数组里,
最后让buf2[] = "张三" 呢?
(一个汉字占两个字节,这个弄起来挺麻烦的。)
搜索更多相关主题的帖子: 阿拉伯 汉字 
2013-11-23 14:39
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:1 
这个简单啊,比较unicode的值就可以了,数字字符和汉字的unicode的值的范围不一样的,通过这一点可以提取汉字。

♂ 死后定当长眠,生前何须久睡。♀
2013-11-23 15:16
andrewkewang
Rank: 2
等 级:论坛游民
帖 子:44
专家分:42
注 册:2013-11-22
收藏
得分:0 
回复 2楼 303770957
“数字字符和汉字的unicode的值的范围不一样的”
具体的,他们的范围是多少?
知道范围后,是可以像下面这样操作吗?
for(i = 0; i < len; i++)//len是buf[]数组的长度
{
    if(buf[i]的值在数字字符的范围中)
        则,赋给一个int型变量
    if(buf[i]的值在标点符号的范围中)
        则,赋给一个char型变量
    if(buf[i]的值在汉字的范围中)
        则,赋给buf2[]
}
但问题是汉字占两个字节,知道范围后,又要具体怎么比较啊?
不知道我这个思路想的对不对。

总之,我想要把char buf[]里的汉字提取到另一个char buf2[]数组里。
对于字符串的处理,我还不太熟练,可以的话,给个代码最好。
2013-11-23 16:29
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:15 
我是根据ASII码来的
供参考
程序代码:
#include<stdio.h>
#include<string.h>
main(o)
{
    int i=0,j=0;
    char a[]="(1,2)张三",b[5];
    puts(a);
    while(a[i]!='\0'){
        if(a[i]<0 || a[i]>255)
            b[j++]=a[i];
        i++;
    }
    b[j]='\0';
    puts(b);
    return 0;
}



三十年河东,三十年河西,莫欺少年穷!
2013-11-23 16:31
kevin_01
Rank: 2
等 级:论坛游民
帖 子:36
专家分:83
注 册:2013-11-23
收藏
得分:1 
回复 4楼 韶志
你好,
请问,ASCII中,小于0,和大于255,都表示汉字吗?那每一个汉字是否对应一个ASCII吗?

Hello  World !
2013-11-23 16:45
andrewkewang
Rank: 2
等 级:论坛游民
帖 子:44
专家分:42
注 册:2013-11-22
收藏
得分:0 
回复 4楼 韶志
用你的程序试了试,虽然可以提取汉字了。
但是,我大概测试了几十个汉字,有一部分可以,有一部分就是一些乱码。
我想,这个条件“if(a[i]<0 || a[i]>255)”还是不太充分。
能给个更好的判断条件吗?
2013-11-23 17:06
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:3 
回复 6楼 andrewkewang
好吧  考虑不充分  见谅
当时我试了好多都可以
既然你说还有的汉字不行   那就忽略我的代码吧

[ 本帖最后由 韶志 于 2013-11-23 17:13 编辑 ]

三十年河东,三十年河西,莫欺少年穷!
2013-11-23 17:09
andrewkewang
Rank: 2
等 级:论坛游民
帖 子:44
专家分:42
注 册:2013-11-22
收藏
得分:0 
回复 7楼 韶志
有可能是编译器的字符集不一样吗?我用的是VC++。
还是说跟具体的机器有关?
真不知道改怎么弄。继续研究ing......
还是谢谢啦,提供了一个思路。
2013-11-23 17:21
andrewkewang
Rank: 2
等 级:论坛游民
帖 子:44
专家分:42
注 册:2013-11-22
收藏
得分:0 
问题弄出来了,分享一下。不过肯定不是最好的办法。
由于我的txt文件里的字符类型只有四种(逗号,左右圆括号,阿拉伯数字,和汉字),所以可以用下面的办法。

问了问别人,ta给了这么一段代码:
char *str = "张三";
for (char *p = str; *p;++p)
{
  printf("%d\n", *p);
}
上面这段代码可以获取出字符的ASCII值。
我获取出“田”字的ASCII,是-109和99。所以,如果取小于0,大于255的范围,就没办法识别“田”字了。
不过我的txt文档里面只有逗号,左右圆括号,阿拉伯数字,和汉字。
这样就可以通过排除另外三种数据类型来识别汉字了。
逗号的ASCII值是44,0-9的是48-57,左括号的是40,右括号的是41。
那么可以这样:
if (buf[i] != 44 && buf[i] != 40 && buf[i] != 41)
{
    if (buf[i] < 48 || buf[i] > 57)
    {
        处理;//参考四楼的代码
    }
}

有高手有更好的办法的话,可以大家继续探讨一下。
2013-11-24 10:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
从“我获取出“田”字的ASCII,是-109和99。”此句推断出你用的是 日本Shift_JIS编码
你先看看Shift_JIS的值范围吧,见 http://zh.

根据wiki的说明,你可以写个完美支持Shift_JIS编码的代码
也可以规律简化为:从左到右遍历,如果字节值大于0x7F(对于signed char就是<0,对于unsigned char就是>0x7F,C/C++没有规定char一定是signed或unsigned),则为多字节字符的前导,其后一字节也为此字符的一部分。
如果你确定只用Shift_JIS编码,就根据wiki说明严格的写;如果你还想兼容其他多字节编码,就用简化规律。

对于你9楼的算法,我本想说你算法错误的。随便举个例子,对于44,你无法确定其为逗号,还是某个多字节字符的一部分。
但看到wiki上说Shift_JIS的第二位字节从0x40开始,我又没法说你的算法错误了^_^。但你还是要明白,你的算法之所以不错,只是瞎猫碰到死老鼠。
2013-12-03 09:42
快速回复:将char型数组里的汉字识别出来,保存到另一个char型数组里,请教怎么实 ...
数据加载中...
 
   



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

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