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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QT+QGIS跨平台编译】之三:【OpenSSL+Qt跨平台编译】(多平台下进行编译)

文章目录 一、OpenSSL介绍二、OpenSSL下载三、Windows下编译四、Linux下编译五、MacOS下编译一、OpenSSL介绍 OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。 …

如何解决Ubuntu 服务器Docker push报错“http: server gave HTTP response to HTTPS client”?

一、问题 二、解决方法 1、编辑/etc/docker/daemon.json 文件&#xff0c; 192.168.1.1xx 换成你自己 registry 服务的地址 sudo nano /etc/docker/daemon.json { "insecure-registries":["192.168.1.1xx:5000"] } 按 Ctrl X 键&#xff1a;保存更改&…

Linux系统运维命令:查看系统的平均负载(查看CPU的负载)

目 录 一、要求 二、快速了解系统资源利用情况的Linux命令 &#xff08;一&#xff09;cat /proc/loadavg命令 1、命令介绍 2、命令输出 3、命令解释 &#xff08;1&#xff09;前三个数字&#xff1a; &#xff08;2&#xff09;第四个值&#xff1a; &…

Android 15 首个开发者预览版到来

作者 / 工程副总裁 Dave Burke Android 15 的首个开发者预览版现已发布&#xff0c;以便各位开发者能与我们通力协作&#xff0c;打造更优秀的 Android 平台。 在 Android 15 中&#xff0c;我们继续致力于打造一个既能提升工作效率&#xff0c;又能提供全新功能的平台。这些新…

linux命令深入研究——cat

cat命令&#xff0c;“猫”&#xff0c;可以理解为瞄一眼文件内容&#xff0c;其中可以用重定向符号对文件进行一些修改&#xff0c;如增加&#xff0c;删除文件内容&#xff0c;其命令参数如-n&#xff0c;-s&#xff0c;-b可以输出带有行号的行 如果想要快速删除文件内容&…

leecode算法三

回溯 划分为k个相等的子集 相似度为 K 的字符串 动态规划 第k个数 使序列递增的最小交换次数 贪心算法 最多盛水容器 雇佣k个工人的最低成本

idea Springboot 组卷管理系统LayUI框架开发mysql数据库web结构java编程计算机网页

一、源码特点 springboot 组卷管理系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢&#xff1f;又该怎样高效的认识、融入团队&#xff1f;并快速进入工作状态呢&#xff1f;这篇文章就来分享一下&#xff0c;希望对即将走向或初入前端职场的你&#xff0c;能够有所帮助。内含大量链接&#xff0c;欢迎点赞收藏&#xff0…

LLM之RAG实战(二十九)| 探索RAG PDF解析

对于RAG来说&#xff0c;从文档中提取信息是一种不可避免的场景&#xff0c;确保从源文件中提取出有效的内容对于提高最终输出的质量至关重要。 文件解析过程在RAG中的位置如图1所示&#xff1a; 在实际工作中&#xff0c;非结构化数据比结构化数据丰富得多。如果这些海量数据无…

神经网络处理器优化设计(一)

神经网络处理器优化设计&#xff0c;涉及到一些特殊和通用处理流程&#xff0c;一是降低硬件成本&#xff0c;二是提高性能。 一 跨层流水线调度 这里主要针对深度可分离卷积&#xff0c;将Pointwise conv与Depthwise卷积并行处理&#xff0c;好处是&#xff0c;减小整体流水时…

c++中的if语句、switch语句、std::map以及多态比较

实现多分支逻辑的场景通常可以使用以下几种技术手段可以选择 if-else语句switch语句三元运算符&#xff08;只能实现2个分支的场景&#xff0c;本文不做讨论&#xff09;映射表&#xff08;std::map、数组或std::vector&#xff09;多态&#xff08;策略模式为例&#xff09; …

java零基础入门-Map集合练习(下)

一、教学目标 能够使用HashMap集合实现值为双列集合存放。能够使用HashMap集合实现值为单列集合存放。能够使用HashMap集合实现值为基本数据类型存放。能够使用HashMap集合实现值为对象存放。 二、HashMap实现自定义元素存放 3、值存放双列集合 对于值又存放map&#xff1f;m…