strcmp使用&模拟实现
【摘要】 strcmp-字符串比较函数返回值: strcmp 是比较字符串的库函数,比较的是字符串的内容,不是长度。比较的是两个字符串中,二者对应的第一个不相等字符的ascii码值大小, 比较的是\0之前的字符int main(){ char* p = "a\0bc"; char* p1 = "a\0bcd"; int ret = strcmp(p, p1); printf("%d\n", ...
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;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)