strcmp函数介绍
在cplusplus官网上是这样介绍strcmp函数的
这里的意思是假如我们输入两个字符串一个是abcdef另一个也是abcdef他们两个字符的每个元素的ascii码值进行比较如果两个元素的ascii码值都相等就移动到下一个元素a与a进行比较b与b进行比较直到遇到\0为止,下面我们来看看这个图片;
这里的意思是如果第一个字符串大于第二个字符串就返回一个大于0的数字,如果两个字符串相等就返回0,如果第一个字符串小于第二个字符串就返回一个小于0的数字,我们来看看这段代码
# include<stdio.h>
# include<string.h>
int main()
{
char arr1[] = {"abcde"};
char arr2[] = {"abcde"};
int ret = strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
这里我们拿arr2与arr1进行比较,这里两个字符串相等就返回0,再来看看不相等,当我们把arr2变成abcd时,arr2就小于arr1那么就返回1,可以看看运行结果。
# include<stdio.h>
# include<string.h>
int main()
{
char arr1[] = {"abcde"};
char arr2[] = {"abcd"};
int ret = strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
同样我们把arr1变成abcd,arr2不变时arr1就小于arr2那么就返回-1。我们可以用这个库函数来写一个密码校对程序,就利用这个性质来进行校对,如果输入的密码与设置的密码相等那么就只用判断返回值是不是为0就行了,如果不是0那么输入的密码错误,这里就不过多描述了。
下面我们来看看strcmp函数的模拟实现,下面是代码。
模拟实现strcmp函数
# include<stdio.h>
# include<assert.h>
int my_strcmp(const char* arr1,const char* arr2)
{
assert(arr1!=NULL);
assert(arr2 != NULL);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
{
return 0;
}
*arr1++;
*arr2++;
}
return *arr1 - *arr2;
}
int main()
{
char arr1[10] = { "asdfghjkl" };
char arr2[10] = { "asdfghjkl" };
int ret = my_strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
分部讲解
先来看看我们的参数部分;
int my_strcmp(const char* arr1,const char* arr2)
这里我们传了两个char*类型的指针过来用const来修饰指针变量,为什么我们要修饰加const变量,那是因为我们不希望传过来的参数在途中被修改了,所以我们要加const来修饰限制这个指针指向的变量不能做任何改变。
assert(arr1!=NULL);
assert(arr2 != NULL);
这里我们用了assert断言,我们要让传过来的字符串有意义不是一个空值,我们就需要用assert断言一下,要让这个字符串不等于空值。
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
{
return 0;
}
*arr1++;
*arr2++;
}
return *arr1 - *arr2;
这里就是程序的关键部分了我们需要对两个字符串指针的解引用 如果解引用之后两个字符串里面被解引用的元素相等就进入这个while循环,为什么这个要用一个这个if (*arr1 == ‘\0’)这个判断条件呢,我们这里是让arr2与arr1进行比较,如果arr1那个拿来比较的字符串里面的指针都指向\0了,是不是就可以证明arr2与arr1相等了。我们就直接返回0就代表两个字符串相等,然后两个字符串指针自增1当走完这个while循环时,就来到最后的return了,为什么要这样写呢,我们要直到指针减去指针得到的是他们之间差了多少个元素如果arr1大于arr2一个大指针减去一个小指针那么得到的值就是正数,反过来就是一个负数,这里就非常巧妙的对应了这里的大于0和小于0的返回值的类型。
下面是运行截图
相等时
大于时
小于时
完。