读书人

微软的strcmp源码简单而绝妙!请大家

发布时间: 2012-11-04 10:42:42 作者: rapoo

微软的strcmp源码,简单而绝妙!请大家帮忙分析下其中的妙处!谢谢!
code:
--------------------------------------------
int __cdecl strcmp (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 );
}
-------------------------------------------

从下面几个方面阐述:

1.src和dst都为空串如何返回?
2.为什么要用unsigned char*强制转换?
3.可否用*src替换*dst作为while条件?
4.是否是multithread-safe?
5.能否用于multibyte-character strings的比较?
6.能否用更少行表达?
----------------------------------------------


[解决办法]

引用楼主 csuchao 的帖子:
从下面几个方面阐述:

1.src和dst都为空串如何返回?
空串是什么?""还是NULL? src和dst都为""的话,那么返回0,如果有一个为NULL,则内存访问违例。

2.为什么要用unsigned char*强制转换?
不能.考虑src和dst是如下值:
char src[] = {0x1, 0x2, 0x3, 0};
char dst[] = {(char)0xb1, (char)0xb2, (char)0xb3, 0};

3.可否用*src替换*dst作为while条件?
可以

4.是否是multithread-safe?


5.能否用于multibyte-character strings的比较?
no

6.能否用更少行表达?
不要犯傻,做些没意义的事。


[解决办法]
探讨
引用楼主 csuchao 的帖子:
从下面几个方面阐述:

1.src和dst都为空串如何返回?
空串是什么?""还是NULL? src和dst都为""的话,那么返回0,如果有一个为NULL,则内存访问违例。

2.为什么要用unsigned char*强制转换?
不能.考虑src和dst是如下值:
char src[] = {0x1, 0x2, 0x3, 0};
char dst[] = {(char)0xb1, (char)0xb2, (char)0xb3, 0};

3.可否用*src替换*dst作为while条件?
可以

4.是否是mu…

读书人网 >C语言

热点推荐