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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值