模拟strcmp库函数的实现(超详细)

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:C语言初阶
⭐代码仓库:C Advanced
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!


前言

strcmp库函数大家可能会比较陌生,用的不多,但是,大家经常搞错的是按照的是字符串长度进行比较的,而真的是这样吗?事实上,strcmp函数是按照字母在字典中按照A ~ Z和a ~ z进行比较的。而且是以ASCII码进行比较的,接下来,让我们深入了解一下strcmp函数吧!


一、简介

1.认识strcmp

在认识这个函数之前,先来一张图片供大家先了解一下strcmp函数。
在这里插入图片描述
在这里插入图片描述

大家可能会好奇一件事情,这个返回值根据字典顺序返回的,那到底会返回什么呢?接下来,上代码,让大家看看返回值吧!

2.返回值

分为三种情况,一是字符串都一样,二是前面字符串大于后面字符串,三是后面字符串大于前面字符串。
在比较之前,有一个很重要的事就是,字符串之间的比较是根据ASCII码进行比较的。

在这里插入图片描述

(1).两者字符串相等

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[] = "abcde";
	char arr2[] = "abcde";
	int tmp = strcmp(arr1, arr2);
	printf("%d\n", tmp);     //结果:0
	return 0;
}

运行结果:
在这里插入图片描述
解析:字符从左往右数所有的ASCII码都一样。

(2).前者大于后者(ASCII)

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[] = "abcdf";
	char arr2[] = "abcde";
	int tmp = strcmp(arr1, arr2);
	printf("%d\n", tmp);     //结果:1
	return 0;
}

运行结果:
在这里插入图片描述
解析:e的ASCII码小于f的ASCII码。

(3).后者大于前者(ASCII)

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[] = "abcde";
	char arr2[] = "abcdf";
	int tmp = strcmp(arr1, arr2);
	printf("%d\n", tmp);     //结果:-1
	return 0;
}

运行结果:
在这里插入图片描述
解析:e的ASCII码小于f的ASCII码。

(4).总结

传入的第一个字符串大于第二个字符串时,返回值为1。
传入的第一个字符串小于第二个字符串时,返回值为-1。
传入的第一个字符串等于第二个字符串时,返回值为0。

在这里插入图片描述

3.逐个字母比较

(1).常规比较

当我们使用strcmp时候,是根据从左往右依次进行比较的,如果前面字母都一样,哪者多了一个字母就哪者大,理解为:多了的那个字母与’\0’进行比较,‘\0’代表的是ASCII码中的数字0,而多的字母是肯定比0大的,‘A’的ASCII 码值为65,'a’的ASCII码值为97。

在这里插入图片描述

(2).只比较前面

在这里插入图片描述
在这里插入图片描述


二、模拟实现strcmp

1.前序

在模拟使用这个库函数之前,我先放一个博客,是我之前写的关于模拟strcpy函数中关于assert和const的介绍:
模拟strcpy函数中的assert和const

2.实现

相信大家看了我的那篇博客,肯定对于这个assert和const有了很深的理解,那我们先实现一下简单的模拟实现。

#include<stdio.h>
int my_strcmp(const char* arr1, const char* arr2)
{
	while (*arr1 == *arr2){    //从第一个往后遍历,一直遍历到不等于的那个字母
		if (*arr1 == '\0'){
			return 0;
		}
		arr1++;
		arr2++;
	}
	if (*arr1 > *arr2){
		return 1;
	}
	else if (*arr1 < *arr2){
		return -1;
	}
}
int main()
{
	char arr1[10] = { 0 };
	char arr2[10] = { 0 };
	gets(arr1);
	gets(arr2);
	int ret = my_strcmp(arr1, arr2);
	if (ret < 0){
		printf("前小于后\n");
	}
	else if (ret > 0){
		printf("前大于后\n");
	}
	else{
		printf("前等于后 \n");
	}
}

3.优化

既然大伙看了assert和const,那我们进行一次优化,加入assert吧!放置空指针进来!

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1, arr2);
	//assert(arr1!=NULL&&arr2!=NULL);
	while (*arr1 == *arr2) {    //从第一个往后遍历,一直遍历到不等于的那个字母
		if (*arr1 == '\0') {
			return 0;
		}
		arr1++;
		arr2++;
	}
	if (*arr1 > *arr2) {
		return 1;
	}
	else if (*arr1 < *arr2) {
		return -1;
	}
}
int main()
{
	char arr1[10] = { 0 };
	char arr2[10] = { 0 };
	gets(arr1);
	gets(arr2);
	int ret = my_strcmp(arr1, arr2);
	if (ret < 0) {
		printf("前小于后\n");
	}
	else if (ret > 0) {
		printf("前大于后\n");
	}
	else {
		printf("前等于后 \n");
	}
}

三、习题

在介绍了那么多的知识,我们来一道习题体会一下strcmp函数的使用吧!

在这里插入图片描述
代码:

#include<stdio.h>
#include<assert.h>
int my_strcmp(char* s1, char* s2) {
	assert(s1, s2);   //断言,防止空指针的传入
	int i = 0;
	while (s1[i] != '\0' || s2[i] != '\0') {   //遍历
		if (s1[i] != s2[i]) {   //找到第一个不相等的那个字母
			return s1[i] - s2[i]; //返回值为ASCII码相减
		}
		i++;
	}
	return 0;
}
int main() {
	int t = 0;
	scanf("%d", &t);    //输入有几组
	int i = 0;
	char s1[100] = { 0 };
	char s2[100] = { 0 };
	for (i = 0; i < t; i++) {
		scanf("%s %s", s1, s2);    //输入两个字符串
	}
	int cnt = my_strcmp(s1, s2);
	printf("%d", cnt);
	return 0;
}

解析:进入函数以后进行从左往右遍历,找到那个不相等的字母并进行ASCII码的相减,返回此值,我们在习题之前讲的都是比较简单的比较,但这个习题让大家充分理解的一下返回值是负数,正数和零,为什么?因为在计算机内部,计算机是以二进制的补码存放数字的,-1的补码很大,代表着后面的字符串大,1的补码还是1,代表着前面的字符串大,如果为0则两者字符串一样大。
在这里插入图片描述


总结

要理解strcmp函数还是有点困难,但当你仔细一步步去理解,打开MSDN去看一下理解一下含义就很快能够上手,理解完最后一道习题,就已经充分理解了全部的strcmp函数。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2022horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值