C语言常见字符串函数模拟实现一:(strlen,strcpy,strcat,strcmp,strstr )

news2024/11/23 22:15:56

strlen模拟实现

重点:1.字符串已经'\0'作为结束标志,strlen返回的是字符串'\0'前面出现的字符个数(不包含'\0')

2.参数指向的字符串必须要以'\0'结束。

3.注意函数的返回值是size_t,是无符号的,加减是无法对比的。

模拟:

size_t my_strlen(const char* arr)
{
	size_t num = 0;
	while (*(arr++) != '\0')
	{
		num++;
	}
	return num;
}

int main()
{
	char arr[] = "abcdef";
	
	printf("%zd\n", my_strlen(arr));
}

 strcpy模拟实现

重点:1.源字符串必须以'\0'结束

2.函数会将源字符串中的'\0'拷贝到目标空间

3.目标空间必须足够大,以确保能存放源字符串

4.目标空间必须可变

模拟:

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20];
	char arr2[] = "abcdef";
	printf("%s\n", my_strcpy(arr1, arr2));
}

strcat模拟实现

重点:1.源字符串必须以'\0'结束

2.目标空间必须足够大,能容纳源字符串的内容

3.目标空间必须可以修改

4.目标空间必须有'\0',函数找到'\0'开始追加

5.字符串不可以自己给自己追加,尽量不要。

模拟:

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);//断言
	char* ret = dest;
	/*while (*dest++)
	{
		;
	}*///为什么不这么写,因为dest就不会在'\0'上了会在'\0'后面一位
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "abcd";
	char arr2[] = "ef";
	printf("%s\n", my_strcat(arr1, arr2));
}

strcmp模拟实现

重点:1.

2.比较对于位置上字符的大小(ASCLL值),不是长度。

模拟:

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;//要相等代表两个字符串长度和对应的字符都一模一样
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abce";
	if (my_strcmp(arr1, arr2) > 0)
	{
		printf(">\n");
	}
	else if (my_strcmp(arr1, arr2) == 0)
	{
		printf("==\n");
	}
	else
	{
		printf("<\n");
	}
}

strstr模拟实现

 模拟:

#include<stdio.h>
#include<assert.h>
//strstr函数模拟,在字符串中找字符串函数

char* my_strstr(const char* arr1,const char* arr2)
{
	assert(arr1 && arr2);
	char* cp = arr1;//记录起点
	char* s1 = arr1;//遍历的指针
	char* s2 = arr2;
	if (!*s2)//如果源字符串什么都没有直接返回目标字符串
	{
		return arr1;
	}
	while (*cp++)
	{
		s1 = cp;
		s2 = arr2;
		while ((*s1 == *s2) && *s1 && *s2)//'\0'停下
		{
			s1++;
			s2++;
		}
		if (!*s2)
		{
			return cp;
		}
	}//其实这里还可以再简洁一点
	return NULL;
}

int main()
{
	char arr1[] = "abbcdef";
	char arr2[] = "bbc";

	printf("%s\n", my_strstr(arr1, arr2));
}

补充:strstr函数模拟实现还有一种 KMP算法更适合,上面的这种写法还可以再修改,大家可以自己想想。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实用的云手机软件有哪些?高性价比云手机推荐

云手机不仅能模拟传统手机的功能&#xff0c;还能实现跨设备操作、数据同步等&#xff0c;极大地提升了用户的便利性。在众多云手机软件中&#xff0c;哪些软件表现出色呢&#xff1f;下面整理了一些功能强大、操作便捷且性能稳定的云手机APP&#xff0c;供大家参考选择。 1. O…

编程练习2 数据单元的变量替换

示例1: 1,2<A>00 示例2: 1,2<A>00,3<A>00 示例3: <B>12,1,2<B>1 示例4: <B<12,1 输出依次如下&#xff1a; #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…

IIS中配置HTTPS证书的详细步骤

在IIS&#xff08;Internet Information Services&#xff09;中导入HTTPS证书的步骤主要包括下载证书、导入证书和为网站绑定证书几个环节。以下是详细的步骤说明&#xff1a; 一、下载SSL证书 首先&#xff0c;确保你已经从证书颁发机构&#xff08;CA&#xff09;下载了适…

三.python入门语法2

目录​​​​​​​ 1.控制结构 1.1.顺序结构 1.2.选择结构 习题 1.3.循环结构 1.3.1. while语句 1.3.2.for语句 1.3.3.循环嵌套 1.4.break语句 1.5.continue语句 1.6.pass语句 习题 1.控制结构 在学习控制结构之前我们通过一个故事来简单的描述一下控制结构&…

DAMODEL丹摩智算:LLama3.1部署与使用

文章目录 前言 一、LLaMA 3.1 的特点 二、LLaMA3.1的优势 三、LLaMA3.1部署流程 &#xff08;一&#xff09;创建实例 &#xff08;二&#xff09;通过JupyterLab登录实例 &#xff08;3&#xff09;部署LLaMA3.1 &#xff08;4&#xff09;使用教程 总结 前言 LLama3…

前端sm2国密加密时注意

如下方法&#xff1a; export function encrypt(str) {const sm2 require("sm-crypto").sm2;const cipherMode 1; // 1 - C1C3C2&#xff0c;0 - C1C2C3&#xff0c;默认为1//自定义密钥let publicKey "xxxxxxxx";//此处加密let a sm2.doEncrypt(str,…

【数字图像处理】简单粗暴介绍最近邻插值和双线性插值(附python实现)

目录 前言最近邻插值理论与公式部分代码部分优缺点 双线性插值理论与公式部分代码实现优缺点 双三次内插 前言 最近邻插值和双线性插值是两种常见的用于图像处理的方法&#xff0c;主要是用于实现图像的放大和缩小。本文中将以最为简单粗暴的方式介绍两种方法的原理&#xff0…

USB-CAN的使用说明

文章目录 前言一、USB-CAN模块二、产品特性三、引脚说明四、使用说明1.USB驱动安装2.CAN配置工具说明1. 菜单栏&#xff1a;2. 模式选择和收发数据显示&#xff1a;3. 数据发送4. 发送模式 五、AT指令设置参数六、硬件测试 前言 CAN总线协议&#xff1a;一种多主、串行通信协议…

淘客系统开发之卷轴模式系统源码功能分析

随着互联网技术的快速发展&#xff0c;电商行业不断创新&#xff0c;探索更加高效、有趣的用户参与机制。其中&#xff0c;卷轴模式作为一种新兴的商业模式&#xff0c;以其独特的积分兑换和任务系统&#xff0c;在淘客系统开发中得到了广泛应用。本文将从技术角度&#xff0c;…

汽车免拆诊断案例 | 2016 款宾利GT车仪表盘上的多个故障灯点亮

故障现象 一辆2016款宾利欧陆GT车&#xff0c;搭载CYCB发动机&#xff0c;累计行驶里程约为4.5万km。据车主反映&#xff0c;发动机偶尔无法起动&#xff0c;仪表盘上的多个故障灯点亮&#xff08;图1&#xff09;。此外&#xff0c;刮水器、电动车窗及空调等电器设备功能失效…

IDC 中国数据安全软件市场报告:顺应平台化趋势,打造综合性的数据安全平台

近期&#xff0c;IDC 发布了针对中国数据安全软件市场规模的预测报告——《中国数据安全软件市场预测&#xff0c;2024-2028》&#xff08;Doc# CHC51601524&#xff0c;2024年9月&#xff09;。该报告针对 2024-2028 年中国数据安全软件市场的规模、增长速度、驱动因素、阻碍因…

剧本杀全新体验:线上剧本杀发挥重要优势

剧本杀作为集游戏社交休闲为一体的消费方式&#xff0c;吸引了众多年轻人&#xff0c;让玩家在游戏中体验到各种角色&#xff0c;还能够满足社交需求。当下&#xff0c;剧本杀市场仍然在快速发展中&#xff01; 剧本杀市场创新 不过&#xff0c;在多年的发展中&#xff0c;剧…

智谱清影 - CogVideoX-2b-部署与使用

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 体验地址&#xff1a;[丹摩DAMODEL官网](https://www.damodel.com/console/overview) CogVideoX 简介本篇将详细介绍使用丹摩服务器部…

C++20中头文件compare的使用

<compare>是C20中新增加的头文件&#xff0c;此头文件是language support库的一部分。它包括&#xff1a;concepts、classes、customization point objects、functions。 1.concepts&#xff1a;三向比较运算符<>&#xff0c;目的是简化比对对象的过程&#xff0c;…

ant design vue中带勾选表格报Tree missing follow keys: ‘undefined‘解决方法

1、这里一定要给columns和data-source设置key即可。 <div><a-table:row-selection"rowSelection":dataSource"tableList":columns"columns":scroll"{ x: 100% }":pagination"false":loading"loading"&g…

戴尔R750 H755N raid卡数据盘改直通模式

1、重启机器进入配置模式&#xff0c;重启后按F2进入bios模式

计算机网络(九) —— Tcp协议详解

目录 一&#xff0c;关于Tcp协议 二&#xff0c;Tcp报头字段解析 2.0 协议字段图示 2.1 两个老问题 2.2 16位窗口大小 2.3 32位序号和确认序号 2.4 6个标记位 三&#xff0c;Tcp保证可靠性策略 3.1 确认应答机制&#xff08;核心&#xff09; 3.2 超时重传机制 3.3 …

最新最详细的Mastercam安装包下载安装教程(保姆级)

正如大家所熟悉的&#xff0c;Mastercam是一款基于PC平台的CAD/CAM软件&#xff0c;集二维绘图、三维实体造型、曲面设计、体素拼合、数控编程、刀具路径摸拟及真实感摸拟等多种功能于一身。 Mastercam发展至今有许多个版本&#xff0c;目前来说常用的版本有Mastercam V91、20…

Windows同时配置两个jdk环境变量

项目场景&#xff1a; Windows同时配置两个jdk环境变量 解压版那么可以更改JAVA_HOME的值&#xff0c;来决定使用哪个版本。安装版可以两个版本同时使用。 操作步骤 1、配置环境变量 在系统环境变量中添加两个环境变量&#xff0c;根据使用需求更改JAVA_HOME的值 2、修改ja…

mariadb实现冷备份与恢复操作案例(物理冷备份,周期性备份)详解

文章目录 前置环境一、物理冷备份1.备份2.恢复检查结果 补充&#xff1a; 周期性恢复操作 前置环境 主机ipmariadb1192.168.10.11mariadb2192.168.10.12 mairadb1操作 安装mariadb yum -y install mariadb-server启动mariadb systemctl start mariadb这里只是演示备份与恢复…