C语言详解strcmp函数的分析及实现

目录
  • 1.函数介绍
    • 1.1.函数接口
    • 1.2.函数分析
    • 1.3.函数的简单使用
    • 1.4.函数使用结果分析
  • 2.库函数strcmp源代码
    • 2.1.库函数源代码
    • 2.2.库函数分析
  • 3.模拟实现 strcmp 函数
    • 3.1.模拟实现
    • 3.2.模拟实现分析

1.函数介绍

1.1.函数接口

int __cdecl strcmp (const char * src,const char * dst);

这里是库函数里面的函数定义接口。这个函数是将 src 和 dst 两个字符串进行比较,即为字符串比较函数。

1.2.函数分析

分析:

1、strcmp 函数是比较两个字符串中字符的顺序的。实际上是拿其字符的ASCⅡ码值来进行比较;

2、拿第一个字符串中的第一字符值减去第二个字符串中的第一个字符,如果为 0,则继续向下比较;若不为 0,则返回差值的数。

3、标准规定:

  • 第一个字符串大于第二个字符串,则返回大于 0 的数字;
  • 第一个字符串等于第二个字符串,则返回 0;
  • 第一个字符串小于第二个字符串,则返回小于 0 的数字。

1.3.函数的简单使用

#include <stdio.h>
#include <string.h>
int main()
{
	char ch1[] = "fbcd";
	char ch2[] = "ab";
	int ret = strcmp(ch1, ch2);
	printf("%d\n", ret);
	return 0;
}

运行结果:

为什么这里结果为1呢而不是其他大于0的数?来看看下面的分析

1.4.函数使用结果分析

分析:

先来看看俩字符串第一个字符在内存中的ASCⅡ值:

上面函数分析里面说了两个字符的ASCⅡ值进行比较之后,不相等的返回大于0的数;因此这里返回的是1。在vs编译器的库函数中对于strcmp函数来说,比较两个字符串ASCⅡ值大于 0 的就都返回 1;小于 0 的就都返回 -1。,当然这里是同意规定了一下,我们还可以不规定,直接返回他们的差值,这样返回的差值也是大于 0 的数和小于 0 的数。

2.库函数strcmp源代码

2.1.库函数源代码

int __cdecl strcmp (const char * src,const char * dst)
{
	int ret = 0 ;
	while((ret = *(unsigned char *)src - *(unsigned char *)dst) == 0 && *dst)
	{
 		++src, ++dst;
 	}
 	return ((-ret) < 0) - (ret < 0);
 }

2.2.库函数分析

分析:

1、这里面先用 unsigned char * 将其指针转化为无符号型,在去取里面存的值,即得到字符的ASCⅡ值;

2、return ((-ret) < 0) - (ret < 0); 这一句就是让差值大于 0 的返回 1;差值小于0的返回 -1。

3.模拟实现 strcmp 函数

3.1.模拟实现

//模拟实现strcmp函数
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 ==  * str)
	{
		if ( *str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main(void)
{
	//strcmp比较的是对应位置上的字符大小
	char ch1[10] = { 0 };
	char ch2[10] = { 0 };
	scanf("%s", ch1);
	scanf("%s", ch2);
	printf("%d\n", my_strcmp(ch1, ch2));
}

3.2.模拟实现分析

分析:

1、因为这里是比较两个字符串,所以字符串都不需要修改,因为都可以用const 修饰;

2、这里模拟实现的时候返回值是两个字符值的差值。

3、也可以写为差值大于 0 返回 1 ;差值小于0返回 -1 形式。

以上代码均可运行,所用编译环境为 vs2019 ,运行时注意加上编译头文件#define _CRT_SECURE_NO_WARNINGS 1

到此这篇关于C语言详解strcmp函数的分析及实现的文章就介绍到这了,更多相关C语言strcmp函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中strcmp的实现原型

    C语言中strcmp的实现原型 实现代码: int __cdecl strcmp ( const char * src, const char * dst ) { int ret = 0 ; while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) ++src, ++dst; if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; ret

  • C语言使用strcmp()函数比较两个字符串的实现

    C语言 strcmp() 函数用于对两个字符串进行比较(区分大小写). 头文件:string.h 语法/原型: int strcmp(const char* stri1,const char* str2); 参数 str1 和 str2 是参与比较的两个字符串. strcmp() 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见\0). 返回值: 如果返回值 < 0,则表示 str1 小于 str2. 如果返回值 > 0,则表

  • C语言详细讲解strcpy strcat strcmp函数的模拟实现

    目录 一.模拟实现strcpy函数 二.模拟实现strcat函数 三.模拟实现strcmp函数 四.小结 一.模拟实现strcpy函数 strcpy函数是字符串拷贝函数,就是将源字符串拷贝到目标空间中. char * strcpy ( char * destination, const char * source );//库函数中的声明 将源(source)指向的c字符串复制到目标(destination)指向的数组中,包括终止的空字符(并在该点停止). 为避免溢出,目标(destination

  • C语言中strlen() strcpy() strcat() strcmp()函数的实现方法

    strlen函数原型:unsigned int strlen(const char *);返回的是字符串中第一个\0之前的字符个数. 1.strcat函数原型char* strcat(char* dest,const char* src); 进行字符串的拼接,将第二个字符串连接到第一个字符串中第一个出现\0开始的地方.返回的是拼接后字符的首地址.并不检查第一个数组的大小是否可以容纳第二个字符串.如果第一个数组的已分配的内存不够容纳第二个字符串,则多出来的字符将会溢出到相邻的内存单元. 2.str

  • C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    目录 一.strlen函数模拟 二. strcpy函数模拟  三.strcat函数模拟 四.strcmp函数模拟 总结 一.strlen函数模拟 字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0'); 有三种方法可以实现该操作: ①计数器方式 ②不能创建临时变量计数器 ③指针-指针  方法一:计数器方式 int my_strlen(const char* str) { int count = 0;//定义count用来记录字符串数组中字符数

  • 浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char *strSrc) { char *res=strDest; assert((strDest!=NULL)&&(strSrc!=NULL)); while(*strDest)strDest++; while(*strDest=*strSrc) { strDest++; strSrc

  • C语言详解strcmp函数的分析及实现

    目录 1.函数介绍 1.1.函数接口 1.2.函数分析 1.3.函数的简单使用 1.4.函数使用结果分析 2.库函数strcmp源代码 2.1.库函数源代码 2.2.库函数分析 3.模拟实现 strcmp 函数 3.1.模拟实现 3.2.模拟实现分析 1.函数介绍 1.1.函数接口 int __cdecl strcmp (const char * src,const char * dst); 这里是库函数里面的函数定义接口.这个函数是将 src 和 dst 两个字符串进行比较,即为字符串比较函数

  • C语言详解select函数的使用

    目录 select select API介绍 select 代码 编译运行: select和poll缺点 select select API介绍 主旨思想: 首先要构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中. 调用一个系统函数,监听该列表中的文件描述符,直到这些描述符中的一个或者多个进行I/O操作时,该函数才返回. a. 这个函数是阻塞 b. 函数对文件描述符的检测的操作是由内核完成的 在返回时,它会告诉进程有多少(哪些)描述符要进行I/O操作. // sizeof(fd_

  • C语言详解如何应用模拟字符串和内存函数

    目录 1.strlen 求字符串长度 使用案例: 1.计数法 2.不创建临时变量计数器-递归 3.指针-指针的方式 2.长度不受限制的字符串函数 1.strcpy 使用案例: 模拟实现: 2.strcat 使用案例: 模拟实现: 3.strcmp-比较字符串首字母的大小 使用案例: 模拟实现: 3.长度受限制的字符串函数  1.strncpy 使用案例: 2.strncat  使用案例: 3.strncmp 使用案例: 4.strstr-找子串  使用案例: 模拟实现: 5.strtok 用法:

  • C语言详解判断相同树案例分析

    目录 一.题目描述 二.解题思路 题目难度:简单 一.题目描述 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. LeetCode链接:相同的树 二.解题思路 核心思路: 先比较两颗二叉树的根节点 如果「都为空」,则返回 true,说明两树相同. 如果「一个为空一个不为空」,说明这两颗树不相同,则返回 false. 如果「都不为空,但节点值不相同」,说明这两颗树不相同,则返回 false. 经过 1 和

  • C语言详解分析进程控制中进程终止的实现

    目录 进程退出的形式 进程退出的几种方法 进程退出的形式 进程退出的几种情况 正常退出(自愿,代码运行完其结果正确) 错误退出(自愿,代码运行完其结果不正确) 异常退出(非自愿,代码异常直接终止) 被其他进程终止(非自愿) 自愿退出会返回一个退出码,由父进程接收. 在Linux上可以使用命令echo $?显示最近一次退出的进程返回的退出码 //现有如下代码,源文件名为mycode.c # include <stdio.h> int main(void) { printf("i am

  • C语言详解函数与指针的使用

    目录 一.函数类型 二.函数指针 三.回调函数 四.小结 一.函数类型 C 语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定,如 int add(int i, int j)的类型为 int(int, int) C 语言中通过 typedef 为函数类型重命名 typedef type name(parameter list) 如 typedef int f(int, int); typedef void p(int); 二.函数指针 函数指针用于指向一个函数 函数名是

  • C语言详解无头单向非循环链表各种操作方法

    目录 链表引入 链表介绍 创建链表 打印链表 创建结点 单链表尾插 单链表头插 单链表尾删 单链表头删 在pos位置之前插入数据 在pos位置之后插入数据 删除pos位置结点 删除pos位置之后的结点 销毁链表 链表查找 链表引入 问:上次我们看了顺序表,那么顺序表有些什么优缺点呢? 优点: 顺序表是连续的物理空间,方便下标的随机访问. 缺点: 1.增容需要申请新空间,拷贝数据,释放旧的空间.会有一定消耗. 2.头部或者中间位置插入或者删除数据,需要挪动数据,效率较低. 3.可能存在一定空间占用

  • mysql count详解及函数实例代码

    mysql count详解 count函数是用来统计表中或数组中记录的一个函数,下面我来介绍在mysql中count函数用法. count(*) 它返回检索行的数目, 不论其是否包含 NULL值. SELECT 从一个表中检索,而不检索其它的列,并且没有 WHERE子句时, COUNT(*)被优化到最快的返回速度. 例如: mysql> SELECT COUNT(*) FROM student; COUNT(DISTINCT 字段)这个优化仅适用于 MyISAM表, 原因是这些表类型会储存一个函

  • 详解房卡麻将分析系列 "牌局回放" 之 播放处理

    详解房卡麻将分析系列 "牌局回放" 之 播放处理 昨天红孩儿给大伙讲了讲"牌局回放"的数据记录处理,有了数据的存储,下面就是数据的显示了. 实话讲,好久没用过 SQL Server 来做数据库了, 网狐的服务器是基于WIN,IOCP,  SQL Server 这套路子.配置好后,可以在QPTreasureDB数据库中看到三个牌局相关的表. 其中dbo.PrivateGameRecord是存储当前游戏的房间及玩家,最终胜负信息的. dbo.PrivateGameRec

  • 详解JS函数防抖

    一.什么是函数防抖 概念:函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间. 举个栗子,坐电梯的时候,如果电梯检测到有人进来(触发事件),就会多等待 10 秒,此时如果又有人进来(10秒之内重复触发事件),那么电梯就会再多等待 10 秒.在上述例子中,电梯在检测到有人进入 10 秒钟之后,才会关闭电梯门开始运行,因此,"函数防抖"的关键在于,在 一个事件 发生 一定时间 之后,才执行 特定动

随机推荐