strcmp模拟实现

strcmp

int strcmp ( const char * str1, const char * str2 );

首先我们先解释一下这个函数的实现逻辑:

当str1 > str2时 返回 1;

当str1 = str2时 返回 0;

当str1 < str2时 返回 -1;

然后我们再考虑一下模拟实现的逻辑和易错点:

1、我们需要一个个对应的比 可能会出现相等的情况,那么我们需要比下一个 也就是需要++;

2、我们还需要考虑出现‘\0’的情况 所以在条件上 我们需要自然而然地 && *str1 或 && *str2

3、比较:避免有符号数导致的计算错误,我们需要转化成无符号数进行比较。

方法一:比较法

int mystrcmp(const char* str1, const char* str2)
{
	//相同和'\0'的情况
	while ((*str1 == *str2) && *str1)
	{
		str1++;
		str2++;
	}

	//比较
	if (*(unsigned char*)str1 > *(unsigned char*)str2)//需要转成无符号数
	{
		return 1;
	}
	else if (*(unsigned char*)str1 < *(unsigned char*)str2)
	{
		return -1;
	}
	else//等于的情况
	{
		return 0;
	}
}

然后我们可以对这个实现进行一点优化

int mystrcmp(const char* str1, const char* str2)
{
	int ret;
	assert(str1);
	assert(str2);
	while ( !(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && str1)
	{
		str1++;
		str2++;
	}
	
	if (ret > 0)
	{
		return 1;
	}
	else if (ret < 0)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

这里可能有同学可能一开始看会有些迷惑,我来慢慢解释一下吧。

相信大家都看出来了 他就是换了个形式的比较,也就是创建了临时变量ret来比较罢了。

而大家的问题可能大部分都出现在

while ( !(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && str1)

这一段代码中。

首先内部是一个ret的计算 相信大家都能看出来是 str1 与 str2的比较,可能大家最诧异的是为什么有个 “!” 非呢? 其实是 这一步的逻辑是 如果两个字符相同则往后移动一位比较,那么当他们相同时,ret等于0,为了让条件为真 我们就在前面加一个“!” 非 就好了。

非常感谢观看 希望能帮到你 有问题可以移步评论区哦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值