C语言strcmp函数讲解

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的返回值的类型。在这里插入图片描述
下面是运行截图
相等时
在这里插入图片描述
大于时
在这里插入图片描述
小于时
在这里插入图片描述
完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/455135.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:7、队列

一、队列的概念与结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头…

功能测试--APP性能测试

功能测试--APP性能测试 内存数据查看内存测试 CPU数据查看CPU测试 流量和电量的消耗流量测试流量优化方法电量测试电量测试场景&#xff08;大&#xff09; 获取启动时间启动测试--安卓 流畅度流畅度测试 稳定性稳定性测试 内存数据查看 内存泄露:内存的曲线持续增长(增的远比减…

码头船只出行和货柜管理系统的设计与实现

针对于码头船只货柜信息管理方面的不规范&#xff0c;容错率低&#xff0c;管理人员处理数据费工费时&#xff0c;采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理&#xff0c;路线管理&#xff0c;新闻管理&#…

【MMDetection3D实战(3)】: KITTI 数据集介绍

文章目录 1. 数据集介绍2 数据下载及准备2.1 下载并整理数据集2.2 传感器及坐标定义2.3 数据的标注3 MMDet3D 中的坐标系规范4 数据的处理及可视化4.1 数据处理4.2 点云读取和可视化4.2.1 点云的读取4.2.2 点云的可视化1. 数据集介绍 KITTI数据集是3D目标检测中比较基础和常用…

【LeetCode】升级打怪之路 Day 17:二叉树题型 —— 二叉树的序列化与反序列化

今日题目&#xff1a; 297. 二叉树的序列化与反序列化652. 寻找重复的子树 目录 LC 297. 二叉树的序列化与反序列化 【classic】 ⭐⭐⭐⭐⭐1&#xff09;序列化逻辑2&#xff09;反序列化逻辑 LC 652. 寻找重复的子树 【稍有难度】 今天主要学习了二叉树的序列化和反序列化相关…

数字逻辑-时序逻辑电路一

一、实验目的 &#xff08;1&#xff09;熟悉触发器的逻辑功能及特性。 &#xff08;2&#xff09;掌握集成D和JK触发器的应用。 &#xff08;3&#xff09;掌握时序逻辑电路的分析和设计方法。 二、实验仪器及材料 三、实验内容及步骤 1、用D触发器&#xff08;74LS74&am…

使用Docker在windows上安装IBM MQ

第一步、安装wsl 详见我另一篇安装wsl文章。 第二步、安装centos 这里推荐两种方式&#xff0c;一种是从微软商城安装&#xff0c;一种是使用提前准备好的镜像安装&#xff0c;详见我另一篇windos下安装centos教程。 第三步、安装windows下的Docker desktop 详见我另一篇wind…

TQ15EG开发板教程:运行MPSOC+AD9361

目录 1&#xff0c;下载工程需要使用的文件 2&#xff0c;编译以及修改工程 3&#xff0c;获取生成BOOT.BIN所需要的3个文件 3.1生成bit文件 3.2生成elf文件 3.3生成fsbl文件 4&#xff0c;生成boot.bin文件 5&#xff0c;上板测试 6&#xff0c;切换FMC接口 7&#…

自适应窗口图片轮播HTML代码

自适应窗口图片轮播HTML代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 代码下载地址 自适应窗口图片轮播HTML代码

分享 | 计算机组成与设计学习资料+CPU设计源码+实验报告

1.引言 百度网盘资源链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Ww6u_l1L6DMXofC2HxfETw?pwdyqd6 提取码&#xff1a;yqd6 2.学习资源预览 2.1 包含学习手册四本&#xff1a; - 计算机原理与设计&#xff1a;Verilog HDL版 - 计算机组成与设…

开源分子对接程序rDock使用方法(2)-高通量虚拟筛选HTVS

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、rDock用于高通量虚拟筛选HTVSMulti-Step Protocol HTVS步骤及注意事项 二、rDock中Multi-Step Protocol用于HTVS的用法Step 1. Exhaustive dockingStep 2. sdreport summaryStep 3. 运行rbhtfi…

Linux之NFS网络文件系统详解

华子目录 简介NFS背景介绍注意 生产应用场景NFS工作原理示例图流程 NFS的使用安装配置文件主配置文件分析权限参数/etc/exports文件内容示例 实验1nfs账户映射实验2实验3 autofs自动挂载服务产生原因安装配置文件分析挂载参数 实验4实验5&#xff1a;本机自动挂载光驱 简介 NF…

专升本 C语言笔记-08 goto语句

goto语句 无条件跳转运算符(凡是执行到goto语句会直接跳转到 定义的标签) 缺点&#xff1a;滥用goto语句将会导致逻辑混乱&#xff0c;导致系统崩溃等问题! ! ! 代码演示 int i 0; //定义标签 jump(名字随便起哦) jump:printf("%d ",i); i; if(i < 10)goto j…

如何处理Android悬浮弹窗双击返回事件?

目录 1 前言 1.1 准备知识 1.2 问题概述 2 解决方案 3 代码部分 3.1 动态更新窗口焦点 3.2 窗口监听返回事件 3.3 判断焦点是否在窗口内部 3.4 窗口监听焦点移入/移出 1 前言 1.1 准备知识 1&#xff09;开发环境&#xff1a; 2D开发环境&#xff1a;所有界面或弹窗…

Burp Suite Professional Error No response received from remote server.

记录burp suite 抓到包-改包-放包之后出现的问题&#xff1a; Burp Suite Professional Error No response received from remote server. 重新下载软件&#xff0c;没有进行汉化&#xff0c;好用了。汉化真坑。

buuctf warmup 超详细

目录 1.代码审计&#xff1a; 2.逻辑分析 3.总结分析 4.分析记录 5.疑点解答 1.代码审计&#xff1a; <?phphighlight_file(__FILE__);class emmm //定义了一个类{public static function checkFile(&$page) 类里面又申明创建…

论文阅读——RemoteCLIP

RemoteCLIP: A Vision Language Foundation Model for Remote Sensing 摘要——通用基础模型在人工智能领域变得越来越重要。虽然自监督学习&#xff08;SSL&#xff09;和掩蔽图像建模&#xff08;MIM&#xff09;在构建此类遥感基础模型方面取得了有希望的结果&#xff0c;但…

【JavaScript】面试手撕柯里化函数

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引入柯里化定义实现快速使用柯里化的作用提高自由度bind函数 参考资料 引入 上周…

目标跟踪SORT算法原理浅析

SORT算法 Simple Online and Realtime Tracking(SORT)是一个非常简单、有效、实用的多目标跟踪算法。在SORT中&#xff0c;仅仅通过IOU来进行匹配虽然速度非常快&#xff0c;但是ID switch依然非常严重。 SORT最大特点是基于Faster RCNN的目标检测方法&#xff0c;并利用卡尔…

跟着GPT学设计模式之桥接模式

说明 桥接模式&#xff0c;也叫作桥梁模式&#xff0c;英文是 Bridge Design Pattern。在 GoF 的《设计模式》一书中&#xff0c;桥接模式是这么定义的&#xff1a;“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就…