看实现:(网上摘录)
int memcmp(const void * cs,const void * ct,size_t count)
{
const unsigned char *su1, *su2;//定义临时指针,因为void*不能做自增自减运算
int res = 0;
for( su1 = (unsigned char* )cs, su2 = (unsigned char* )ct; 0 < count; ++su1, ++su2, count--)
if ((res = *su1 - *su2) != 0)//按一个字节来比较。
break;
return res;
}
int strncmp(const char * cs,const char * ct,size_t count)
{
register signed char __res = 0;
while (count) {
if ((__res = *cs - *ct++) != 0 || !*cs++)//注意参数是否到了'\0'做了判断,到了则停止
break;
count--;
}
return __res;
}
结论:①memcmp比较的是给定的整个内存块,strcnmp在第一个参数遇到‘\0’时就会停止,使用的场景不一样。
②void*类型,
在ANSIC标准中,不允许对void指针进行算术运算如pvoid++或pvoid+=1等,而在GNU中则允许,因为在缺省情况下,GNU认为void *与char *一样。sizeof(*pvoid )== sizeof( char).有关void*详看此文章http://blog.csdn.net/geekcome/article/details/6249151
vs测试时的反汇编源码时发现源代码??(暂时没搞):
int __cdecl strncmp (
const char * first,
const char * last,
size_t count
)
{
size_t n = 0;
if (!count)
return(0);
if( count >= 4 )
{
/* unroll by four */
for (; n < count-4; n += 4)
{
first += 4;
last += 4;
if (*(first - 4) == 0 || *(first - 4) != *(last - 4))
{
return (*(unsigned char *)(first - 4) - *(unsigned char *)(last - 4));
}
if (*(first - 3) == 0 || *(first - 3) != *(last - 3))
{
return (*(unsigned char *)(first - 3) - *(unsigned char *)(last - 3));
}
if (*(first - 2) == 0 || *(first - 2) != *(last - 2))
{
return (*(unsigned char *)(first - 2) - *(unsigned char *)(last - 2));
}
if (*(first - 1) == 0 || *(first - 1) != *(last - 1))
{
return (*(unsigned char *)(first - 1) - *(unsigned char *)(last - 1));
}
}
}
/* residual loop */
for (; n < count; ++n)
{
if (*first == 0 || *first != *last)
{
return (*(unsigned char *)first - *(unsigned char *)last);
}
++first;
++last;
}
return 0;
}