关于strcmp源码的一点疑问解决办法
关于strcmp源码的一点疑问
这里为什么要将char*强制类型转换为unsigned char *呢?
------解决思路----------------------
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标准没规定,但有一些字任集会利用高位为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
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 *呢?
------解决思路----------------------
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标准没规定,但有一些字任集会利用高位为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