strcmp使用&模拟实现

举报
芒果_Mango 发表于 2022/02/26 21:39:17 2022/02/26
【摘要】 strcmp-字符串比较函数返回值: strcmp 是比较字符串的库函数,比较的是字符串的内容,不是长度。比较的是两个字符串中,二者对应的第一个不相等字符的ascii码值大小, 比较的是\0之前的字符int main(){ char* p = "a\0bc"; char* p1 = "a\0bcd"; int ret = strcmp(p, p1); printf("%d\n", ...

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。