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,为了让条件为真 我们就在前面加一个“!” 非 就好了。
非常感谢观看 希望能帮到你 有问题可以移步评论区哦。