strcmp,strncmp函数详解

2024-04-29 23:12
文章标签 函数 详解 strcmp strncmp

本文主要是介绍strcmp,strncmp函数详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字典序

字典序,也称为词典序或字序,是指对于两个字符串而言,逐个比较对应位置的字符,字符大小是按照ASCII码从小到大来比较的,如果字符串相同部分的前缀都相同,则较短的词有较小的字典序;如果比较的字符串长度不同,那么较短的字符串在前。

举例来说,在字典序中,字符串 "apple" 会排在 "banana" 之前,因为第一个不同的字符是 'a' 和 'b',而 'a' 在ASCII码中比 'b' 小。同样地,"apple" 会排在 "app" 之后,因为虽然 "app" 是 "apple" 的前缀,但 "apple" 长度更长。

字典序在多种场合中都有应用,特别是在编程和数据结构中,比如排序算法、字典树(Trie)等。在这些应用中,字典序提供了一种明确的顺序,使得我们可以对字符串进行排序、查找或其他操作。

 strcmp函数

strcmp函数是C语言中的一个字符串比较函数,用于比较两个字符串是否相等

注意这是根据两个字符串相同位置的字符对应的ASCII码值进行大小的比较,并不是比较字符串长度,也就是说这个结果取决于两个字符串中第一个不同字符的ASCII码的大小

函数原型为:

int strcmp(const char *s1, const char *s2);

函数参数:

  • s1:要比较的第一个字符串
  • s2:要比较的第二个字符串

函数返回值:

  • 如果s1和s2相同,则返回0
  • 如果s1小于s2,则返回一个负数
  • 如果s1大于s2,则返回一个正数

函数功能:

  • 比较两个字符串,并返回比较结果

函数实例:

#include <stdio.h>
#include <string.h>int main() {char str1[10] = "Hello";char str2[10] = "HellO";int result;result = strcmp(str1, str2);if(result == 0) {printf("两个字符串相等\n");} else {printf("两个字符串不相等\n");}return 0;
}

输出结果:

 两个字符串不相等

注意点

1,字符串的比较是按照字典序进行的,因此大小写字母的比较结果不同。

#include <stdio.h>
#include <string.h>int main()
{char str1[] = "hello";char str2[] = "HELLO";int ret = strcmp(str1, str2);if (ret == 0)printf("str1和str2相等\n");else if (ret > 0)printf("str1大于str2\n");elseprintf("str1小于str2\n");return 0;
}


 运行结果: 

str1大于str2

2,在比较字符串时,需要确保字符串以'\0'结尾,否则可能会导致比较结果不正确。

#include <stdio.h>
#include <string.h>int main()
{char str1[] = "hello";char str2[] = "hello";str1[5] = '!';int ret = strcmp(str1, str2);if (ret == 0)printf("str1和str2相等\n");else if (ret > 0)printf("str1大于str2\n");elseprintf("str1小于str2\n");return 0;
}

 运行结果: 

str1大于str2

分析: 

在这段代码中,我们将str1字符串的结尾标识符'\0'改成了'!',运行代码后,输出结果为"str1大于str2"。这是因为str1字符串没有以'\0'结尾,所以strcmp函数会继续比较下去,直到遇到str2字符串的结尾标识符'\0'。由于str1字符串比str2字符串长,所以str1被认为是大于str2。

模拟实现

strcmp函数是C语言标准库中的一个函数,用于比较两个字符串。它的基本功能是逐个比较两个字符串中的字符,直到找到一个不同的字符或者遇到字符串的结束符\0。基于这个定义,strcmp函数的模拟实现可以有多种方式。以下是一些可能的模拟实现方式:

1. 基本循环比较

这是最直接的模拟实现方式,使用循环逐个比较两个字符串中的字符。

 #include <stddef.h> // 包含 size_t 的定义  int my_strcmp_basic(const char *s1, const char *s2) { assert(s1&&s2); while (*s1 && (*s1 == *s2)) {  s1++;  s2++;  }  return *(const unsigned char *)s1 - *(const unsigned char *)s2;  } 

2. 指针算术实现

使用指针算术可以稍微简化代码,使循环内部的索引操作更加清晰。

int my_strcmp_pointer(const char *s1, const char *s2) {assert(s1&&s2);   while (*s1 && (*s1 == *s2)) {  s1++;  s2++;  }  return *(const unsigned char *)s1 - *(const unsigned char *)s2;  
}

3. 使用宏定义简化比较操作

可以定义一些宏来简化比较操作,但这通常不会改变算法的基本结构。

 #define COMPARE_CHARS(c1, c2) ((c1) - (c2))  int my_strcmp_macro(const char *s1, const char *s2) { 
assert(s1&&s2);  while (*s1 && (*s1 == *s2)) {  s1++;  s2++;  }  return COMPARE_CHARS(*s1, *s2);  } 

注意事项:

  1. 在所有实现中,我们都将字符转换为unsigned char类型,以避免在有符号字符为负时发生符号扩展问题。这是为了确保比较操作按预期进行。
  2. strcmp函数在比较字符串时区分大小写,这意味着大写和小写字母被视为不同的字符。如果你需要不区分大小写的比较,你需要实现一个不同的函数,比如strcasecmp或stricmp,并在比较之前将字符转换为相同的大小写。
  3. 在实际应用中,还需要考虑错误处理,比如当s1或s2为NULL时应该怎么做。标准库函数strcmp在任一参数为NULL时会返回未定义的结果,因此模拟实现时也应遵循相同的约定或提供额外的错误检查。
     

 strncmp函数

  1. strncmp函数是标准C库(C Standard Library)中的一个用于比较字符串的函数。
  2. 与strcmp函数类似,strncmp函数也用于比较两个C风格字符串(以空字符’\0’结尾的字符数组),但它只比较前n个字符。
  3. strncmp函数的原型定义在<string.h>头文件中。

它的原型如下:

int strncmp(const char *str1, const char *str2, size_t n);

其中,str1和str2分别是待比较的两个字符串的指针,n是指定要比较的字符数。

如果str1和str2的前n个字符相等(或者在比较过程中遇到了空字符’\0’),则strncmp返回0。
如果str1在字典顺序上小于str2(即str1的第一个不同字符的ASCII值小于str2的对应字符),则strncmp返回一个负整数。

如果str1在字典顺序上大于str2(即str1的第一个不同字符的ASCII值大于str2的对应字符),则strncmp返回一个正整数。

需要注意的是,比较的结果是根据字符的ASCII码值来确定的。如果n大于两个字符串中较短的字符串的长度,函数会一直比较到较短的字符串的末尾。

示例代码如下:

#include <stdio.h>
#include <string.h>int main() {char str1[] = "Hello";char str2[] = "World";int result = strncmp(str1, str2, 3);if (result < 0) {printf("str1 is less than str2\n");} else if (result > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}return 0;
}

这段代码比较了str1和str2的前3个字符,结果为"str1 is less than str2",因为'H'的ASCII码值为72,'W'的ASCII码值为87

strncmp和strcmp的区别

srcmp 和 strncmp 都是 C 语言的字符串比较函数,用于比较两个字符串的大小。它们的区别在于参数和返回值的处理方式。

  1. strcmp 函数:

    • 参数:strcmp 函数接受两个参数,分别是要比较的两个字符串。
    • 返回值:strcmp 函数的返回值为整型,比较结果为负数、零、正数三种情况,分别表示第一个字符串小于、等于、大于第二个字符串。
  2. strncmp 函数:

    • 参数:strncmp 函数除了接受两个字符串参数外,还额外接受一个整型参数 n,用于指定要比较的字符个数。
    • 返回值:strncmp 函数的返回值也为整型,比较结果与 strcmp 函数类似,表示第一个字符串小于、等于、大于第二个字符串。

不同之处:

  • strcmp 函数会比较两个字符串的每个字符,直到遇到不相等的字符或者一个字符串的结束符 '\0'。而 strncmp 函数会在指定的字符个数内进行比较,如果没有达到指定字符个数,就会根据比较结果返回。
  • strncmp 函数可以用于比较部分字符串,而 strcmp 函数只能比较整个字符串。

需要注意的是,在使用 strcmp 或 strncmp 函数比较字符串时,需要保证字符串以 '\0' 结尾,否则可能导致比较结果不正确。

这篇关于strcmp,strncmp函数详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947410

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)