11 12
发新话题
打印

[求助] 汉字字符串比较问题(已解决)

汉字字符串比较问题(已解决)

最近要做数据结构的课程设计……
  我们小组选的题是基于二叉排序树的一个算法……其中要用到字符串比较的问题。一般的比较可以调用系统自带的函数完成。但是汉字字符串编码是怎么回事?要对输入的汉字字符串进行比较应该怎么做啊?
  因为设计要在6月20日验收答辩,时间较紧,所以麻烦懂得学长尽快能给讲讲……先谢谢了……

[ 本帖最后由 刹那芳华 于 2008-6-18 12:33 编辑 ]
汗水与泪水一起流淌
思念和眷恋共同血葬

TOP

汉字字符可以用wchar_t.....
呃..每个汉字两个字节....
dev-c++下的话用char也行......判别时英文字符为一个字节...
汉字是两个...首个字节小于0..也就是说它是个有符号char...是1xxxxxxxx(2进制)......如果一个字节的值小于0....则它是汉字的第一个字符....和下来一个字节构成汉字......
本帖最近评分记录
他大舅他二舅都是他舅,高桌子低板凳都是木头~

TOP

汉字字符串比较在C++中使用的是宽字符集wchar_t

宽字符内型wchar_t。
wchar_t被定义为: typedef unsigned short wchar_t ;显然它是16位的。
wchar_t类型的常字串应该这样写: L"hello" 。
因此可以这样定义一个宽字符指针 wchar_t *pwc=L"hello";。
免费内容:
C语言相关
  对应于char, C语言中也有宽字符内型wchar_t。wchar_t被定义为: typedef unsigned short wchar_t ;显然它是16位的。wchar_t类型的常字串应该这样写: L"hello" 。因此可以这样定义一个宽字符指针 wchar_t *pwc=L"hello";
  对于字符串函数, C语言中也有两个版本。如对应于strlenwcslenwprintfprintf的宽字符版。当然这两个版本的函数使用各自类型的参数,原因是显然的,char和unsigned short 怎么能等同呢?编译器是不会放过你的。
  下表是对char,wchar_t相关内容的比较:

(测试环境:VC++6.0)char类型wchar_t类型
类型大小(32位系统)8位16位
常量字符表示法'A'L'A' 或 'A'
常量字符串表示法'hello'L'hello'
一些使用方法char c='A'; (c的值:0x41)wchar_t wc='A'; (wc的值:0x0041)
char* p='hello';wchar_t* pw=L"hello";
sizeof sizeof("hello")=6 sizeof(L"hello")=12
计算长度strlen("hello")=5wcslen(L"hello)=5

  既然有两个版本的函数,如果我们想在程序中同时支持它们该怎么办?如果使用VC++,你只要在程序中包含tchar.h头文件,这个文件中提供了一些宏以兼容两种字符集。例如:

#ifdef _UNICODE
 typedef wchar_t _TCHAR;
 typedef wchar_t TCHAR;
 #define __T(x) L ## x
 #define _tprintf wprintf
 #define _tcslen wcslen
 ......
#else
 typedef char _TCHAR;
 typedef char TCHAR;

 #define __T(x) x
 #define _tprintf printf
 #define _tcslen strlen
 ......
#endif


#define _T(x) __T(x)
#define _TEXT(x) __T(x)

  我们只要使用TCHAR,_tpirntf,_tcslen,_TEXT等,就可以兼顾两种字符集。
·Windows相关
  Windows2000/NT完全支持Unicode,Windows98对Unicode支持很少。我们关心的是怎样编写程序,既可以编译为不支持Unicode,又可编译为支持Unicode。Windows SDK的头文件中定义了一些宏以完成这个任务。

typedef char CHAR ;
typedef wchar_t WCHAR ; // wc
typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;
typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;
typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;

  和标准C一样,windows C也使用TCHAR作为兼容的类型

#ifdef UNICODE
 typedef WCHAR TCHAR, * PTCHAR ;
 typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
 typedef LPCWSTR LPCTSTR ;
 #define __TEXT(quote) L##quote
#else
 typedef char TCHAR, * PTCHAR ;
 typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
 typedef LPCSTR LPCTSTR ;
 #define __TEXT(quote) quote
#endif

  另外还有一个TEXT宏,等价于__TEXT宏:#define TEXT(quote) __TEXT(quote)
  写Win32 SDK程序的时候常常在注册窗口类时使用如下代码:

if (!RegisterClass (&wndclass)) {
  MessageBox ( NULL, TEXT ("This program requires Winodws 2000/NT"), szAppName,            MB_ICONERROR) ;
  return 0 ;
}

  这样,当在Windows98下运行使用了Unicode的程序时,程序可以给出提示并退出。这段代码为什么在Win98下可以运行?因为MessageBox在存在Unicode的定义下,被替换为MessageBoxW,而MessageBoxW是Win98支持的少数宽字符Windows函数之一。
  总之,写Windows SDK程序时尽可能使用像TCHAR,PTSTR,LPCTSTR,TEXT这样的宏。
本帖最近评分记录

TOP

一个汉字占两个字节, 比如'我' 这个字可以拆成十进制值(无符号)为  206 , 210 的两个字节.
strcmp的实现中,是按照字节来比较的,汉字的大小应该按照组成它的两个字节大小去比较,跟字符比较原理是一样的啊

当然不同的编码方式不同,汉字编码占用的字节数也不一样,但是这个不要紧,全部顺序去比较字节,就像英文字符串比较一样去处理是没有问题的。
附 strcmp 实现:
int mystrcmp (const char * src, const char * dst)
{
    int ret = 0 ;
    while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
        ++src, ++dst;
    if ( ret < 0 )
        ret = -1 ;
    else if ( ret > 0 )
        ret = 1 ;
    return( ret );
}

附:输出字符串各个字符的ascii 值序列:
int prt(const char *str){
    unsigned int c;
    while((c=*(unsigned char *)str++)) {
        printf("%d ",c);
    }
    printf("\n");
    return 0;
}


测试比较
char *p1="我们的啊";
char *p2="我们的a";

输出序列
    我            们         的           啊
206 210 195 199 181 196 176 161
    我            们         的       a
206 210 195 199 181 196 97

比较结果:
RESULT=1   

p1大于p2

[ 本帖最后由 小西 于 2008-6-17 15:02 编辑 ]
本帖最近评分记录
OPENSOURCE

TOP

结合LS两位学长解释的差不多已经很清楚了……
恩,谢谢学长……呵呵[
汗水与泪水一起流淌
思念和眷恋共同血葬

TOP

晕啊
基本上看不懂了
我要永远做最强者!!!
不管别人会怎么说!!!
也不管别人会怎么看!!!

TOP

引用:
原帖由 完美世界 于 2008-6-17 16:21 发表
晕啊
基本上看不懂了
呵呵……这些是专业了一点撒……
汗水与泪水一起流淌
思念和眷恋共同血葬

TOP

其实用TCHAR....用_T()宏格式化字符串,这样代码移植性好,想怎么编译怎么编译,
多字符集就编译成w_char   ansi就编译成char了  对应的函数也用 lstrXXX
windows核心编程的建议.....开始就讲unicode的问题
    所有的暧昧就这样结束吧
        你不爱我
            就不要给我任何期待.
          你会是无心的
              但是我会很在意......
                                等待和希望,送给所有的朋友。

TOP

C++ 的话还是用std::string 或者 std::wstring 吧
直接重载了== 运算符

TOP

引用:
原帖由 唐尸三摆手 于 2008-6-18 09:25 发表
C++ 的话还是用std::string 或者 std::wstring 吧
直接重载了== 运算符
哦...我也学习了....不知道有个wstring.........
他大舅他二舅都是他舅,高桌子低板凳都是木头~

TOP

 11 12
发新话题