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

各种库函数的模拟实现

  • 一、模拟实现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.mfbz.cn/a/166513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学霸教你自学人工智能

在这个信息爆炸的时代&#xff0c;人工智能已经渗透到我们生活的方方面面。无论是语音助手、自动驾驶汽车&#xff0c;还是医疗诊断&#xff0c;人工智能都在发挥着越来越重要的作用。如果你对人工智能充满热情&#xff0c;希望在这个领域有所建树&#xff0c;那么&#xff0c;…

STM32CubeMX学习笔记-CAN接口使用

STM32CubeMX学习笔记-CAN接口使用 CAN总线传输协议1.CAN 总线传输特点2.位时序和波特率3.帧的种类4.标准格式数据帧和遥控帧从STM32F407参考手册中可以看出主要特性如下CAN模块基本控制函数CAN模块消息发送CAN模块消息接收标识符筛选发送中断的事件源和回调函数 CubeMX项目设置…

庖丁解牛:NIO核心概念与机制详解 04 _ 分散和聚集

文章目录 Pre概述分散/聚集 I/O分散/聚集的应用聚集写入Code Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解 01 庖丁解牛&#xff1a;NIO核心概念与机制详解 02 _ 缓冲区的细节实现 庖丁解牛&#xff1a;NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片 概述 分散/聚…

C++二分查找算法:有序矩阵中的第 k 个最小数组和

本文涉及的基础知识点 二分查找算法合集 本题的简化 C二分查找算法&#xff1a;查找和最小的 K 对数字 十分接近m恒等于2 题目 给你一个 m * n 的矩阵 mat&#xff0c;以及一个整数 k &#xff0c;矩阵中的每一行都以非递减的顺序排列。 你可以从每一行中选出 1 个元素形成…

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(3)

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法&#xff08;3&#xff09; 工程目的IIC时序图IIC 读写操作方法汇总正点原子IIC实验工程整体框图和模块功能简介&#xff0c;如表下图所示&#xff1a; IIC 驱动模块设计时钟规划状态跳转流程单次写操作的波形图如下图所示&…

程序员带你入门人工智能

随着人工智能技术的飞速发展&#xff0c;越来越多的程序员开始关注并学习人工智能。作为程序员&#xff0c;我们可能会对如何开始了解人工智能感到困惑。今天&#xff0c;我将向大家介绍一些如何通过自学了解人工智能的经验和方法&#xff0c;帮助大家更好地入门这个充满挑战和…

【Java集合】聊聊Hashmap的哈希函数、扩容、树化

哈希函数 hashmap是开发中常用的一个集合&#xff0c;除了一些基本的属性、put、get等流程&#xff0c;本篇文章主要介绍下哈希函数、扩容、树化的一些细节。 而hash函数就是hashmap的重中之重。 static final int hash(Object key) {int h;return (key null) ? 0 : (h key…

YOLOv8改进 | EIoU、SIoU、WIoU、DIoU、FoucsIOU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv8的重大改进&#xff0c;特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;还融合了“Focus”思想&#xff0c;创造了一系列新的损失函数。这些组合形式的…

Halcon Solution Guide I basics(1): Guide to Halcon Methods(Halcon解决方案)

文章目录 文章专栏前言文章解读基础解决方案字符串格式化 文章专栏 Halcon开发 前言 今天来看Halcon的第一章内容&#xff0c;Halcon解决方案 文章解读 基础解决方案 Halcon大部分的应用都使用了三种常用的算子应用用于图像的预处理。 Image Acquisition&#xff1a;图像加…

6 Redis的慢查询配置

1、redis的命令执行流程 redis的慢查询只针对步骤3 默认情况下&#xff0c;慢查询的阈值是10ms 在配置文件中进行配置 //这个参数的单位为微秒 //如果将这个值设置为负数&#xff0c;则会禁用慢日志功能 //如果将其设置为0&#xff0c;则会强制记录每个命令 slowlog-log-slow…

[python]python筛选excel表格信息并保存到另一个excel

目录 关键词平台说明背景所需库1.安装相关库2.代码实现sourcetarget1 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 背景 从一个excel表中遍历删选信息并保存到另一个excel表 所需库 1.openpyxl &#xff1a;是一个用于读写 Excel 文件的 Pyt…

2023.11.17 关于 Spring Boot 日志文件

目录 日志文件作用 常见的日志框架说明 门面模式 日志的使用 日志的级别 六种级别 日志级别的设置 日志的持久化 使用 Lombok 输出日志 实现原理 普通打印和日志的区别 日志文件作用 记录 错误日志 和 警告日志&#xff08;发现和定位问题&#xff09;记录 用户登录…

牛客::栈的压入、弹出序列

栈的压入、弹出序列 题目 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xff0c;序列4,5,3,2,1是该压栈序列对应的一个弹出序列&…

三、LED闪烁

通过LED的闪烁实验&#xff0c;详解Keil MDK中创建mm32单片机的工程的步骤。 1、开发环境 (1)Keil MDK: V5.38.0.0 (2)MCU: mm320163D7P。 2、Keil工程的创建 (1)打开Keil MDK。 (2)点击“Project”→“New μVision Project...”。 (3)选择工程保存地址及工程文件名&…

RE2文本匹配实战

引言 今天我们来实现RE2进行文本匹配&#xff0c;模型实现参考了官方代码https://github.com/alibaba-edu/simple-effective-text-matching-pytorch。 模型实现 RE2模型架构如上图所示。它的输入是两个文本片段&#xff0c;所有组件参数除了预测层和对齐层外都是共享的。上图…

变周期控制思路

举例&#xff1a;热值调节的过程中&#xff0c;调节周期在偏差较小时&#xff0c;可以设置较大些&#xff0c;调节周期在偏差较大时&#xff0c;可以设置较小些。并且在偏差较大时&#xff0c;立刻进入调节&#xff08;计时器清零&#xff09;。 -350<偏差<600&#xff0…

华为麒麟服务器--硬盘问题

记录以下今天处理的服务器&#xff1a; 情况说明&#xff1a;linux 系统&#xff0c;不知道什么原因系统就突然不能用了&#xff08;据说是前段时间断电来着&#xff0c;但是机房有应急电源&#xff09;。 系统环境&#xff1a; 服务器&#xff1a;华为RH2288H V3 服务器 服…

设计模式(二)-创建者模式(2-0)-简单工厂模式

一、简单工厂模式定义 客户端不需要关注创建实例的过程。于是需要通过工厂模式&#xff0c;要把创建对象过程和使用对象进行分离。所以客户端只要使用对象即可&#xff0c;而创建对象过程由一种类来负责&#xff0c;该类称为工厂类。 由于创建实例的方式是在静态方法里实现的…

文件钓鱼-后缀隐藏文件捆绑文件压缩释放技巧

0x00 文件钓鱼 简单说下文件样本钓鱼的目的&#xff0c;为诱导用户安装木马文件&#xff0c;达到控制或者窃取某些信息的目的&#xff0c;抛开邮件的真实性。木马的伪造是一个比较关键的点&#xff0c;下面简要说下三种木马文件伪装的技巧 0x01 水坑攻击与鱼叉攻击的概念 水坑…

VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)

目录 一、服务器信息二、192.168.132.33主服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 …
最新文章