比较函数大合集:strcmp,strncmp,memcmp

article/2025/11/8 13:17:55

前言:

接着奏乐接着舞,我们继续来看字符串函数和内存函数。今天要讲的是比较函数大合集,话不多说,开肝!!!

strcmp函数:

什么是strcmp函数?

strcmp即string compare,翻译过来就是字符串比较。顾名思义就是用来比较字符串大小的函数。

它的返回类型是int,当前者大于后者返回1,前者等于后者返回0,前者小于后者返回-1.参数有2个,一个源头字符串,一个目标字符串。因为仅仅对二者进行比较并不对其进行修改,所以用const修饰防止其被更改。它的头文件是string.h。

strcmp函数如何使用?

看实操:

strcmp的进阶知识:

1.关于字符串的比较

在C语言中,两个字符串是没办法直接进行比较的。就比如上面就是个错误示范,字符串"abcdefg"或者arr1/arr2都等于字符串首元素地址,那显然两个地址不相同,所以输出不等于。在这种情况下就得使用strcmp函数进行比较。

而在这个例子中,却相等了。原因是因为p,q两个都是常量字符串,p,q都指向同一块内存(abcdefg的地址),地址自然相同。所以等于。

2.strcmp的返回值

通过上面的例子我们知道两个字符串相等时,返回值是0.那么如果不相等,返回值是什么呢?

谁长谁就大吗?

通过以上例子,我们可以发现strcmp的比较并非是谁长谁就大那么简单。而是取决于第一个不同的字符的大小。

结论strcmp本质上比较的是第一位不同位的ASCII码值大小。

例如两个字符串A,B。若所有对应字符都相同,则strcmp(A,B)=0,若第一位不同位的ASCII码值,A大于B,那么无论B后面多长,都返回1。反之返回-1.

就像上面最后一个例子,虽然arr2仅仅是c\0,但strcmp(arr1,arr2)=-1。

自定义strcmp函数:

代码自取:

int my_strcmp(const char* str1,const char* str2)
{assert(str1 && str2);//防止str1和str2存在空指针的情况while (*str1 == *str2){if (*str1 == '\0')//两个指针都遇到\0了还没跳出循环,说明两个字符串都相等{return 0;}str1++;str2++;}if (*str1 > *str2)//在遇到第一位不同位时跳出循环,所以可以直接比较*str1和*str2{return 1;}else{return -1;}
}

strncmp函数:

什么是strncmp函数?

strncmp的返回值和strcmp一样,但参数多了个n。它与strcmp的关系就像strncpy和strcpy函数之间的关系一样,都是多了个n来控制字节数。自然而然,strncmp是用来比较两个字符串前n个字节(前n个字符,因为字符类型大小是1个字节在32位编译器中)的大小。头文件同样是string.h

strncmp函数如何使用?

看实例:

特殊情况:

如果要比较的字节数超出了其中一个字符串长度呢?

当要比较的字节数超出了字符串长度时,在一个字节一个字节比较过程中遇到\0(无论是谁的),就会停止比较。在上面两个例子中第一个为1是因为0的ASCII码值大于\0的ASCII码值。

自定义strncmp函数:

代码自取:

int my_strncmp(const char* str1, const char* str2, size_t num)
{int n = 1;while (*str1 == *str2){if (*str1 == 0 || n == num){return 0;}str1++;str2++;n++;}if (*str1 > *str2){return 1;}else{return -1;}
}

其中原理和strcmp函数的自定义很像,无非就加了个n控制比较的次数。

memcmp函数:

什么是memcmp函数?

strcmp只能比较字符串数据,局限性比较大。所以在比较其他数据时,我们使用memcmp函数。

memcmp,即memory compare,翻译过来就是内存比较。他的返回类型时int,有3个参数,buf1,buf2为void*类型是因为定义函数的人并不知道使用者用它来比较什么样的数据,所以定义为void*来接受。memcmp函数同样采用了count来控制比较的字节数。头文件是memory.h或者string.h

memcmp函数如何使用?

老样子,纸上谈兵是不行的,看实操:

memcmp进阶知识:

1.memcmp的比较方式和strcmp一样吗?

明显不一样,例一中看起来好像和strcmp一样,第一位不同位刚好2<1输出-1,但在例二中第一位不同位即1048592明显大于4112,理论上应该输出1但是却输出了-1,这是为什么呢?

解析:

结论:

memcmp和strcmp比较的内核都是第一位不同位(按一个字节一个字节比较),而非第一位不同元素。

2.如果比较整形数据时,比较的字节不是数据的整形倍呢?

在此程序中我们比较arr1,arr2的21个字节,但仍然输出了1,这是为什么?

解析:

结论:所以在使用memcmp函数对于超过一个字节的数据比较时,要格外注意小端存储模式还是大端存储模式。

3.memcmp在比较时的字节数超过了某一个内存块时会怎样?

因为arr2只有4个字节的大小,让它和arr1比较20字节显然不够,所以系统会报警告。虽然比较出来也是-1,但是这样做十分不安全。

结论:

在使用memcmp函数时,要注意比较的字节数不可超出比较内存的大小。

自定义memcmp函数:

代码自取:

#include<assert.h>
int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{assert(ptr1 && ptr2);//强制类型转化char* ptr11 = (char*)ptr1;char* ptr22 = (char*)ptr2;while (*ptr11 == *ptr22 && num--) {ptr11++;ptr22++;}if (*ptr11 > *ptr22){return 1;}else if (*ptr11 < *ptr22){return -1;}return 0;
}

既然要一个字节一个字节比较,那么我们直接给他强制类型转换成char*类型的,从而实现一个字节一个字节比较。

结语:

总结:对于字符数据比较时,用strcmp和strncmp,专业对口。其他用memcmp。

ok辣,到这里比较函数大合集就结束了!

读到就是赚到!希望大家有所收获,我会很开心的(●ˇ∀ˇ●)

青山不改,绿水长流。我们下期再见!!!

还是那句老话:路漫漫其修远兮,吾将上下而求索!!!


http://chatgpt.dhexx.cn/article/sRogACSP.shtml

相关文章

Linux 字符串截取命令

Linux 字符串截取&#xff0c;一般用在 shell 脚本中&#xff0c;本篇写几个简单的 demo 跟大家分享一下 首先&#xff0c;定义一个变量 demohttps://blog.csdn.net/ 1.使用 # 号截取&#xff0c;删除左边字符&#xff0c;保留右边字符 echo ${demo#*//} 其中&#xff0c;demo…

bat字符串截取

举例&#xff1a;输入hello world和-2&#xff0c;输出ld 这个简单。代码如下 echo off&Setlocal enabledelayedexpansion :标签1 set 文本hello world set 开头-2 set 结尾 set /p 文本请输入文本&#xff0c;留空使用默认值hello world set /p 开头请输入取值开头位…

批处理字符串截取

批处理字符串截取 在批处理中&#xff0c;set的功能有点繁杂&#xff1a;设置变量、显示环境变量的名及值、做算术运算、等待用户的输入、字符串截取、替换字符串&#xff0c;是我们常用的命令之一。 在字符串截取方面&#xff0c;新手因为没能注意到偏移量的问题&#xff0c;…

整理了几种字符串截取方法

一、 (Substring);(Remove);(Replace) 1、取字符串的前i个字符 (1)string str1str.Substring(0,i);(2)string str1str.Remove(i,str.Length-i); 2、去掉字符串的前i个字符 string str1str.Remove(0,i);string str1str.SubString(i); 3、从右边开始取i个字符 string str1str.Sub…

JSTL标签的使用详情

if 标签 choose标签 forEach标签 这里是JSTL的标签文档&#xff0c;我们主要介绍几个常用的 https://www.runoob.com/jsp/jsp-jstl.html if 标签 if标签为判断标签&#xff0c;没有else标签&#xff0c;多个分支就用个if判断 例子 访问结果 choose标签 choose标签为选择标签…

JSTL标签库的使用及其常用标签

目录 什么是JSTL标签库&#xff1f; 使用JSTL标签库的步骤&#xff1a; 第一步&#xff1a;引入JSTL标签库对应的jar包。 第二步&#xff1a;在JSP中引入要使用标签库。&#xff08;使用taglib指令引入标签库。&#xff09; 第三步&#xff1a;在需要使用标签的位置使用即可。…

JSP之自定义jstl标签

目录 一&#xff0c;什么是JSP&#x1f351; 二&#xff0c;什么是JSTL&#xff08;JSTL标签库&#xff09;&#x1f353; 三&#xff0c;如何使用JSTL&#x1f345; 在项目中如何使用JSTL标签&#xff1f;在发开中使用JSTL标签库需要执行如下两个步骤。 &#xff08;1&a…

什么是JSTL标签?常用的标签库有哪些?

从JSP1.1规范开始&#xff0c;JSP就支持使用自定义标签&#xff0c;使用自定义标签大大降低了JSP页面的复杂度&#xff0c;同时增强了代码的重用性。为此&#xff0c;许多Web应用厂商都定制了自身应用的标签库&#xff0c;然而同一功能的标签由不同的Web应用厂商制定可能是不同…

jsp--JSTL标签库

目录 1.JSTL标签库介绍 2.JSTL 标签库的使用步骤 3.core核心库使用 3.1 <c:set> 3.2 <c:if /> 3.3 <c:choose> <c:when> <c:otherwise >标签 3.4 <c:forEach /> 1.JSTL标签库介绍 JSTL 标签库&#xff0c;全称是指 JSP Standard …

【Java Web】JSTL标签库的引入

在使用JSTL标签前首先要引入JSTL标签库 引入&#xff1a; <% taglib prefix"c" uri"http://java.sun.com/jsf/core" %> taglib是JSP指令&#xff0c;功能是用来引入标签库&#xff1b; prefix意思是前缀&#xff0c;指的就是使用标签时的前缀&a…

常见JSTL标签详解

JSP标准标签库&#xff08;JSTL&#xff09; jsp标准标签库&#xff08;jstl&#xff09;是一个JSP标签集合&#xff0c;它封装了jsp应用的通用核心功能。 JSTL支持通用的、格式化的任务。比如&#xff1a;迭代、条件判断、XML文档操作、国际化标签、SQL标签。除了这些它还提供…

JSTL标签库之核心标签

一、JSTL标签库介绍   JSTL标签库的使用是为弥补html标签的不足&#xff0c;规范自定义标签的使用而诞生的。使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二、JSTL标签库的分类 核心标签(用得最多)国际化标签(I18N格式化标签)数据库标签(SQL标签&#xff0c;很…

JSTL标签库的使用

1 JSTL 1.1 JSTL概述 1&#xff09;简介 JSTL的全称是&#xff1a;JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。 它由以下5个部分组成&#xff1a; 组成作用说明Core核心标签库。通用逻辑处理Fmt国际化有关。需要不同地域显示不同语言时使用Fun…

JSTL标签库 | 深入解析JSTL标签库

目录 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 2、使用JSTL标签库的步骤 3、JSTL标签的原理 4、jstl中的核心标签库core当中常用的标签 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 ①Java Standard Tag Lib&#xff08;Java标准的标签库&am…

JSTL标签库详细介绍

目录 一JSTL标签库 二、核心&#xff08;Core&#xff09;标签库 通用标签 循环控制标签 导入文件和URL 总结 一JSTL标签库 JSTL是一个不断完善的开放源代码的JSP标签库&#xff0c;是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上…

JSTL标签库

JSTL&#xff08;Java Server Pages Standerd Tag Library&#xff0c;JSP标准标签库&#xff09;包含用于编写和开发JSP页面的一组标准标签&#xff0c;它可以为用户提供一个无脚本环境。在此环境中&#xff0c;用户可以使用标签编写代码&#xff0c;而无须使用Java脚本。在JS…

JSTL标签

一、概念 JSTL的全称是JavaServer Pages Tag Library&#xff0c;我们也称之为JSP标准标签库。它是由Apache组织提供的开源的免费的jsp标签 二、作用 用于简化和替换jsp页面上的java代码 三、使用步骤&#xff1a; 导入jstl相关jar包引入标签库&#xff0c;通过<% tagl…

JSTL核心标签超详细

1.JSTL介绍 JSTL&#xff08;JavaServer Pages Standard Tag Library&#xff0c;JSP标准标签库)是一个JSP标签集合&#xff0c;它封装了JSP应用的通用核心功能。 JSTL支持通用的、结构化的任务&#xff0c;比如迭代&#xff0c;条件判断&#xff0c;XML文档操作&#xff0c;…

关于网站最近出现504错误的总结,too open many files in system

如果你有耐心看完这篇文章&#xff0c;也许会给你带来真正的益处。 网站出现504错误&#xff0c;如果你用阿里云CDN的话还会报 504 Gateway Time-out The gateway did not receive a timely response from the upstream server or application. Powered by Tengine 这样一句…

腾讯云服务器网站504,使用腾讯、百度云CDN现403和504错误的解决及使用CDN踩的坑...

最近源站出网流量超出带宽的限定值&#xff0c;经常导致服务器丢包。最近有点频繁&#xff0c;甚至一小时丢好几次&#xff0c;如下图所示&#xff1a; 于是考虑接入 CDN &#xff0c;腾讯云CDN送了300G流量&#xff0c;但是接入后经常打不开页面&#xff0c;就换了百度云CDN。…