练习题——【学习补档】库函数的模拟实现

news2025/1/12 18:47:25

各种库函数的模拟实现

  • 一、模拟实现strlen
    • 1.地址-地址型
    • 2.递归型
    • 3.计数器型
  • 二、模拟实现strcpy
  • 三、模拟实现strcmp
  • 四、模拟实现strcat
  • 五、模拟实现strstr

一、模拟实现strlen

模拟实现strlen有三种方法
1.地址-地址型
2.递归型
3.计数器型

1.地址-地址型

//	//1.地址-地址型
#include<stdio.h>
int main()
{
	//通过首字符的地址减去最后一个字符的地址来计算字符串长度
	const char* str =  "abcdef";
	const char*  p1 = 0;
	const char*  p2 = 0;
	p1 = str;
	while (*(str++) != '\0')
	{}
	str--;
	p2 = str;
	printf("%d",p2-p1);
	return 0;
}

2.递归型

//2.递归型
//递归型是通过一个递归,逐个的将字符计算
#include<stdio.h>
#include<assert.h>
 
int my_strlen(const char* str)
{
	assert(str);
	if ((*str) != '\0')
		return my_strlen(++str) + 1;
	else
		return 0;
}
int main()
{
	const char* str =  "abcdef";
	int ret =my_strlen(str);
	printf("%d",ret);

	return 0;
}

3.计数器型

//3.计数器型
//计数器型是逐个数字符串中的字符个数,直到遇到\0
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
	assert(str);
	int i = 0;
	while (*(str++) != '\0')
	{
		i++;
	}
	return i;
}
int main()
{
	const char* str =  "abcdef";
	int ret = my_strlen(str);
	printf("%d",ret);

	return 0;
}

在这里插入图片描述

二、模拟实现strcpy

模拟实现strcpy
#include<stdio.h>
#include<assert.h>
 
char* my_strcpy( char* str2, const char* str1)
{
	assert(str2 && str1);	//确保两个地址不是空地址
	char* ret = str2;	//将初始地址保存
	while(*str2++ = *str1++)	//直接将地址1指向的内容赋给地址2指向的空间
	{
		;
	}
	return ret;	//返回地址2
}
int main()
{
	char str1[] = "abcdef";
	char str2[20] = {0};
	printf("%s\n", str1);
	printf("%s\n", my_strcpy(str2, str1));
	return 0;
}

在这里插入图片描述

三、模拟实现strcmp

//strcmp功能为比较两个字符串,前一个字符串的每个字符的ascall是否大于后一个
#include<stdio.h>
#include<string.h>
#include<assert.h>

int my_strcmp(const char *str1 ,const char* str2)
{
	assert(str1 && str2);
	while ( *str1 >= *str2)
	{
		if (*str2 == '\0')
			return 0;	//如果str1内包含了完整的str2,则返回0
		str1++;
		str2++;
	}
	return str1 - str2;		//如果str1的ascal码大于str2 则会返回一个正数,否则会返回一个负数
}

int main()
{
	//首先定义两个字符串用于比较
	char str1[] = "abcdef";
	char str2[] = "abcd";
	
	if (my_strcmp(str1, str2) > 0)
	{
		printf(">\n");
	}
	else if (my_strcmp(str1, str2) == 0)
	{
		printf("=\n");
	}
	else if (my_strcmp(str1, str2) < 0)
	{
		printf("<\n");
	}
	else
	{
		printf("error\n");
	}
	return 0;
}

在这里插入图片描述

四、模拟实现strcat

//strcat的功能是在一个字符串的后面追加另一个字符串,并在这一过程中,覆盖前面字符串的\0,添加后面字符串的\0

#include<stdio.h>
#include<string.h>
#include<assert.h>

char* my_strcat(char* str1, const char* str2)
{
	//记住各个数组的开头
	char* p1 = str1;
	const char* p2 = str2;
	//找到前面数组str1的尾巴
	while (*(p1)!='\0')	
	{
		p1++;
	}
	//将str2的内容接到str1的尾巴上
	while (*(p2) != '\0')
	{
		*(p1++) = *p2;
		p2++;
	}
	*p1 = '\0';
	return str1;
}

int main()
{
	char str1 [10] = "aaa";
	char str2 [10] = "bbb";
	printf("%s", my_strcat(str1, str2));
	return 0;
}

在这里插入图片描述

五、模拟实现strstr

//strstr的功能是在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL

#include<stdio.h>
#include<string.h>
#include<assert.h>

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* p1 = str1;
	const char* p2 = str2;
	const char* cp = str1;

	//找到p1与p2指向相同内容的位置,并确保二者不会出现空对实;
	while (*(p1) != *(p2))
	{
		if (p1 && p2 == 0)
			return 0;
		p1++;
	}
	//p1、p2内容一致时退出循环

	cp = p1;	//记录p1、p2内容相同且不为/0,的位置的坐标

	//判断后续内容是否一致
	while (*p1 == *p2)
	{
		if (*p2 == '\0')	//当p2的内容被对比完毕时,则说明str1内部含有str2
			return cp;
		//如果p2对比还未完成,p1就到头了怎么办
		if (*p1 == '\0')
			return 0;
		p1++;
		p2++;
	}
	return 0;
}

int main()
{
	char str1[] = "abcdef";
	char str2[] = "def";
	printf("%p", my_strstr(str1, str2));
	return 0;
}

在这里插入图片描述

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

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

相关文章

新茶饮进入“大逃杀”赛程

2023年&#xff0c;是新茶饮IPO的爆发年&#xff0c;也可能是淘汰赛的起始年。 10月18日&#xff0c;奈雪的茶披露了今年第三季度运营情況&#xff0c;数据显示&#xff0c;截至9月30日&#xff0c;奈雪的茶共经营1360家店。而自7月份开放加盟后&#xff0c;至今只发展了4家加…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第五套智能合约安全漏洞测试

第五套题的智能合约安全漏洞测试题目 环境 : ubuntu20 Truffle v5.8.3 (core: 5.8.3) Ganache v7.8.0 Solidity v0.8.3 Node v18.16.0 Web3.js v1.8.2 前言 请在测试的时候开启ganache打开,并且在truffle的配置文件配好ganache,之前两个帖子忘说了/(ㄒoㄒ)/~~ truffle-con…

第四代可燃气体监测仪:可燃气体监测仪在燃气管网中的作用有哪些

燃气管网如同城市的血脉&#xff0c;纵横交错着覆盖在每一寸土地。然而如此复杂的管网&#xff0c;仅靠人工巡查难免有些力不从心。毕竟人工监测的范围有其局限性&#xff0c;难以做到全方位、全天候的紧密监测&#xff0c;难免会有疏忽和遗漏。如何将安全隐患消灭于萌芽状态&a…

WPF TextBox实现placeholder

WPF里TextBox没有placeholder&#xff0c;需要自己实现&#xff0c;本篇博客介绍WPF TextBox实现placeholder&#xff0c;效果如下&#xff1a; 实现技巧是在 TextBox 控件的 Style 中使用触发器&#xff08;Triggers&#xff09;来显示和隐藏placeholder文本。xmal代码如下&am…

基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管

一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构&#xff0c;该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标&#xff0c;Tiva™C系列架构提供了一个具有FPU的80…

京东商品详情数据接口【京东API接口开发系列】,监控京东价格走势,接口代码示例,可高并发批量获取

京东开放平台提供了API接口来访问京东商品详情。通过这个接口&#xff0c;您可以获取到商品的详细信息&#xff0c;如商品名称、价格、库存量、描述等。 以下是使用京东商品详情API接口的一般步骤&#xff1a; 注册并获取API权限&#xff1a;您需要在京东开放平台上注册并获取…

初级测试工程师必看的功能测试六点要义

前言 根据一份报告&#xff0c;应用程序崩溃导致71&#xff05;的卸载。迫使用户卸载应用程序的其他原因是页面响应时间&#xff0c;混乱的UI&#xff0c;电池消耗等。这表明功能测试和非功能测试对于交付用户友好型应用程序的重要性。 一、测试基础的重要性 作为一名测试新…

js实现全选按钮

目录 html代码 css代码 js代码 完整代码 html代码 先把整体结构样式写出来 <table><thead><tr><th class"allCheck"><input type"checkbox" name"" id"checkAll" /><span class"all"&…

VCP-DCV VMware vSphere,即将开课~想了解点击查看

VCP-DCV VMware vSphere 本周开课~ 想报名的必须提前预约啦 &#x1f447;&#x1f447;&#x1f447; 课程介绍 本课程重点讲授如何安装、配置和管理VMware vSphere 8.0&#xff08;包括VMware ESXi™ 8.0和VMware vCenter Server™ 8.0&#xff09; 本课程将帮助您做好…

「编程学习书籍总结」提升个人能力从读书开始

✍️作者简介&#xff1a;码农小北&#xff08;专注于Java、Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f449;关注✨、…

音视频开发是不是C++开发中最难的细分方向?

音视频开发是不是C开发中最难的细分方向&#xff1f; 是不是最难不敢说(毕竟数据库、Office、 大型游戏可能更难)&#xff0c;但确实也已经很难 了。至少对我 这种主要搞web前端的人来说&#xff0c;真的有那种力不从心的感觉。最近很多小伙伴找我&#xff0c;说想要一些音视频…

设计模式系列:三、责任链设计模式

一、概述 责任链模式是一种行为设计模式&#xff0c;它允许多个对象处理一个请求&#xff0c;从而避免了请求的发送者和接收者之间的耦合关系。 优点是把任务划分为一个一个的节点&#xff0c;然后按照节点之间的业务要求、顺序&#xff0c;把一个个节点串联起来&#xff0c;…

Vulnhub 解决虚拟机网络问题

前言&#xff1a; 有的时候&#xff0c;我们从vulnhub官网下载ovf文件导入到虚拟机后&#xff0c;使用扫描器扫描存活的时候发现扫不到靶机的IP&#xff0c;这是因为虚拟机的网卡配置有问题。我们需要进安全模式修改一些配置。 1. 在虚拟机开机的时候按一下上下键&#xff0c;让…

全国的科技创新情况数据分享,涵盖2020-2022年三年情况

随着国家对科技创新的重视和大力支持&#xff0c;全国的科技创新情况越来越受到关注。 我们根据中国城市统计年鉴的这方面指标&#xff0c;分析汇总得出全国科技创新情况数据&#xff0c;需要说明的是&#xff0c;由于统计年鉴指标调整&#xff0c;每一年的数据并非字段相同&a…

Ubuntu Server download

前言 Ubuntu——公共云、数据中心和边缘上最受欢迎的 Linux 发行版。自成立以来&#xff0c;Ubuntu 一直在获得市场份额&#xff0c;截至今天已接近 50%。 Ubuntu Server download VersionUbuntu Server 其它主机型号版本Ubuntu AMD历史版下载百度云Ubuntu Server all Ubuntu…

onnx模型转换opset版本和固定动态输入尺寸

背景&#xff1a;之前我想把onnx模型从opset12变成opset12&#xff0c;太慌乱就没找着&#xff0c;最近找到了官网上有示例的&#xff0c;大爱onnx官网&#xff0c;分享给有需求没找着的小伙伴们。 1. onnx模型转换opset版本 官网示例&#xff1a; import onnx from onnx im…

python3函数

1、定义函数 函数代码块以def关键词开头&#xff0c;后接函数标识符名称和圆括号任何传入参数和自变量必须放在圆括号中间&#xff0c;圆括号之间可以用于定义参数函数内容以冒号&#xff1a;起始&#xff0c;并且缩进return【表达式】结束函数&#xff0c;选择性返回一个值调…

【数据结构(三)】双向链表(2)

文章目录 1. 基本概念2. 管理双向链表的思路3. 代码实现 1. 基本概念 管理单向链表的缺点分析: ①单向链表&#xff0c;查找的方向只能是一个方向&#xff0c;而双向链表可以向前或者向后查找。     ②单向链表不能自我删除&#xff0c;需要靠辅助节点 &#xff0c;而双向…

Ubuntu18.04安装LeGO-LOAM保姆级教程

系统环境&#xff1a;Ubuntu18.04.6 LTS 1.LeGO-LOAM的安装前要求&#xff1a; 1.1 ROS安装&#xff1a;参考我的另一篇博客Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客文章浏览阅读168次。Ubuntu18.04安装ROS-melodic保姆级教程https://blog.csdn.net/…

拓扑排序-

有向无环图是拓扑排序 拓扑排序将图中所有的顶点排成一个线性序列&#xff0c;使得所有的有向边均从序列的前面指向后面。 拓扑排序使用深度优先搜索来实现&#xff0c;图中有环则无法进行拓扑排序 一个有向图&#xff0c;如果图中有入度为0的点&#xff0c;就把这个点删掉…