首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于strcmp源码的1点疑问

2013-02-06 
关于strcmp源码的一点疑问int __cdecl strcmp (const char *src, const char *dst) //没看见const {int re

关于strcmp源码的一点疑问


int __cdecl strcmp (const char *src, const char *dst) //没看见const 

        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 ); 


这里为什么要将char*强制类型转换为unsigned char *呢? c
[解决办法]
ascii码只定义了0-127,没有定义128-255是什么,但是因为char类型有8位,使用者还是有可能给出128-255的值。

标准规定char的实现类型可以是unsigned char,也可以是signed char。在一些硬件上,可能用signed char表示char,这样如果碰到128-255的值,结果就成了负数了。

转成unsigned char后,这个函数就可以用于char的全部可能取值范围。虽然标准没有要求,但这样做也没坏处。反正在0-127的范围内符合标准就行了。

这样做的好处就是可以借用这个函数来按字节比较任意字节序列,其内容不一定是合法的字符串。

还有在遇到超出标准外的情况时,保证在所有硬件上的结果是一样的,可移植性强。否则有时解释成signed char,有时解释成unsigned char。
[解决办法]
引用:
有木有人?我查了一下ascII码最大值到0x7f,不可能高位为1呀?


ascii标准没规定,但有一些字任集会利用高位为1来扩展ascii字符集,用于显示外国字母和表格菜号。比如说IBM extended character set。

在DOS时代,窗口和菜单边框经常用IBM extended character set来显示,现在图型界面都用不到了。

[解决办法]
 4.11.4 Comparison functions

The sign of a nonzero value returned by the comparison functions is determined by the sign of the difference between the values of the first pair of characters (both interpreted as unsigned char ) that differ in the objects being compared.

4.11.4.1 The memcmp function
...
4.11.4.2 The strcmp function

热点排行