「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
strcmp-字符串比较函数
返回值:
strcmp 是比较字符串的库函数,比较的是字符串的内容,不是长度。比较的是两个字符串中,二者对应的第一个不相等字符的ascii码值大小, 比较的是\0之前的字符
int main()
{
char* p = "a\0bc";
char* p1 = "a\0bcd";
int ret = strcmp(p, p1);
printf("%d\n", ret); //0
return 0;
}
//此时认为p和p1指向的字符串相等
int main()
{
char arr1[] = "abcde";
char arr2[] = "abce";
int ret = strcmp(arr1, arr2);
if (ret > 0)
{
printf("arr1 > arr2\n");
}
else if (ret < 0 )
{
printf("arr1 < arr2\n");
}
else
{
printf("arr1 = arr2\n");
}
return 0;
}
打印结果: arr1 < arr2
前面的字符abc都相等,arr1第四个字符d的ascii码值小于arr2第四个字符e的ascii码值,所以arr2>arr1
若写成:
char arr1[] = "abcde";
char arr2[] = "abc";
此时打印:arr1 > arr2
原因:arr2的第四个字符为\0,小于arr1的第四个字符d对应的ascii码值
注意:Ascii码是没有负数的
模拟实现strcmp
思路:遍历两个字符串,对应位置的字符比较是否相等,找到第一个二者对应不相等的字符,解引用,比较其对应的ascii码值
**注意:**当二者指向的字符相同时,判断其中一个指向的是不是\0,如果是,说明这两个字符串是一样的,
两个字符串只需要比较,不需要修改,所以用const修饰
int my_strcmp(const char* s1,const char* s2)
{
assert(s1 && s2);
//当二者指向的字符相同时,继续找,直到找到不相等的,或者其中一个为\0了,那就跳出循环
while(*s1 == *s2)
{
//先判断其中一个是不是\0,如果是,说明两个字符串是一样的,二者都指向了\0
if(*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
//找到指向不想等的字符了(或者一个为\0了),解引用比较对应的值
return *s1 - *s2;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf("arr1 > arr2\n");
}
else if (ret < 0 )
{
printf("arr1 < arr2\n");
}
else
{
printf("arr1 = arr2\n");
}
return 0;
}
简化:
int my_strcmp(const char* s1,const char* s2)
{
//当s1,s2都不为\0,且二者指向的字符相等,就继续遍历,
//跳出循环时,s1和s2指向的就是不想等的字符,或者其中一个或者s1和s2指向的都是\0,若两个都是\0,解引用之后返回0
while( *s1 && *s2 && (*s1 == *s2) )
{
s1++;
s2++;
}
return *s1 - *s2;
}