memcmp与strncmp


看实现:(网上摘录)
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;
} 



你可能感兴趣的:(c/c++)