strcmp使用&模拟实现

136 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

strcmp-字符串比较函数

image.png


返回值:

image.png

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