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

各种库函数的模拟实现

  • 一、模拟实现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;elsereturn 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,则返回0str1++;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内部含有str2return 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.mzph.cn/news/161132.shtml

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

相关文章

云服务器-从零搭建前后端服务

使用须知 选择0M带宽不能访问公网&#xff08;不分配公网IP&#xff09;&#xff0c;如需分配公网IP请增加带宽值。云服务器ECS默认不开启虚拟内存如您需要使用请登录云服务器内部操作。Linux开启swap&#xff08;虚拟内存&#xff09;、Windows虚拟内存的设置若您购买了数据盘…

含分布式电源的配电网可靠性评估matlab程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a; 基于仿射最小路法的含分布式电源配电网可靠性分析——熊小萍 主要内容&#xff1a; 通过概率模型和时序模型分别进行建模&#xff0c;实现基于概率模型最小路法的含分布式电源配电网…

web需求记录

需求1&#xff1a;根据后端传过来的设备名:DESKTOP-4DQRGQB&#xff0c;以及mac:e0:be:03:74:40:0b&#xff1b;iQOO-8&#xff0c;mac:b0:33:66:38:c3:25&#xff0c;用web option 是动态增加的&#xff08;也就是那个选择框里面的东西是根据后端传过来的值动态增加的&#xf…

upload-labs关卡12(基于白名单的%00截断绕过)通关思路

文章目录 前言一、靶场需要了解的前置知识1、%00截断2、0x00截断3、00截断的使用条件1、php版本小于5.3.292、magic_quotes_gpc Off 二、靶场第十二关通关思路1、看源代码2、bp抓包%00截断3、验证文件是否上传成功 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&…

LL(1)语法分析程序设计与实现

制作一个简单的C语言词法分析程序_用c语言编写词法分析程序-CSDN博客文章浏览阅读322次。C语言的程序中&#xff0c;有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表&#xff0c;给出对应的识别码&#xff0c;然后跟据对应的表格…

国民新旅游时代,OTA们如何制胜新周期?

文 | 螳螂观察&#xff08;TanglangFin&#xff09; 作者 | 图霖 消费全面复苏的大背景下&#xff0c;旅游业正迎来预期中的拐点。 一个显著表现是&#xff0c;旅游消费正在从可选消费转化成必选消费。 国内消费者旅游需求的不降反增&#xff0c;就是最好的印证。 同程研究…

DoFaker: 一个简单易用的换脸工具

DoFaker: 一个简单易用的换脸工具 基于insightface开发&#xff0c;可以轻松替换视频或图片中的人脸。支持windows和linux系统&#xff0c;CPU和GPU推理。onnxruntime推理&#xff0c;无需pytorch。 更新 2023/9/16 更新动作迁移算法2023/9/14 更新脸部增强算法(GFPGAN)和超分…

TypeScript枚举

1、数字枚举 enum Direction {Up,Down,Left,Right, } var Direction; (function (Direction) {Direction[Direction["Up"] 0] "Up";Direction[Direction["Down"] 1] "Down";Direction[Direction["Left"] 2] "L…

[点云分割] 基于颜色的区域增长分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <thread> #include <vector>#include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/search/search.h> #include <pcl/search/kdtree.h> #inclu…

AR道具特效制作工具

AR&#xff08;增强现实&#xff09;技术已经逐渐渗透到各个行业&#xff0c;为企业带来了全新的营销方式和用户体验。在这个背景下&#xff0c;美摄科技凭借其强大的技术实力和创新精神&#xff0c;推出了一款专为企业打造的美摄AR特效制作工具&#xff0c;旨在帮助企业轻松实…

MIKE水动力笔记19_统计平均潮差

本文目录 前言Step 1 ArcGIS中创建渔网点Step 2 将dfsu数据提取到渔网点Step 3 Python统计平均潮差 前言 日平均潮差&#xff08;average daily tidal range&#xff09;&#xff1a;日高潮潮高合计之和除以实有高潮个数为日平均高潮潮高&#xff0c;日低潮潮高合计之和除以实…

Quartz .Net 的简单使用

参考了&#xff1a;c# .net framework 4.5.2 , Quartz.NET 3.0.7 - runliuv - 博客园 (cnblogs.com) https://www.cnblogs.com/personblog/p/11277527.html&#xff0c; Quartz.NET 作业调度&#xff08;一&#xff09;&#xff1a;Test - 简书 自己要轮询的任务&#xff1a…

NX二次开发UF_CAM_PREPRO_init_module 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREPRO_init_module Defined in: uf_cam_prepro.h int UF_CAM_PREPRO_init_module(void ) overview 概述 Initializes the required environment for this module. 初始化此…

浅谈Python装饰器原理与用法分析

前言 本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、装饰器的本质是函数&#xff0c;主要用来装饰其他函数&#xff0c;也就是为其他函数添加附加功能 2、装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装…

VScode调试没有反应

点击调试按钮后没反应 有可能是vscode中安装的python插件版本问题 可以通过重新安装比较旧一点的python尝试解决此问题 步骤如下&#xff1a; 然后从中选择比当前版本更低的版本即可 安装完成后需重启vscode

初识EasyAR

EasyAR 一、介绍&#xff08;核心还是 目标图像的屏占比&#xff09; 支持 EasyAR-AR|AR技术|AR SDK|Unity AR|下载 1.表面、图片(静止/运动)跟踪&#xff0c;支持多目标 2.3D物体(静止/运动)跟踪(注&#xff1a;物体旋转、远近移动也可以&#xff0c;本人试过&#xff0c;…

纵享双创盛宴 “之江创客”再创电商新辉煌

消费日报网讯&#xff08;记者 牛夏风&#xff09;营造良好电商双创生态&#xff0c;集聚电商发展新势能。10月31日&#xff0c;以“开放、连接、协同、赋能”为主题的“之江创客”2023全球电子商务创业创新大赛总决赛暨颁奖典礼在湖州南浔圆满落幕。 记者从现场获悉&#xff…

SQL 中的 MIN 和 MAX 以及常见函数详解及示例演示

SQL MIN() 和 MAX() 函数 SQL中的MIN()函数和MAX()函数用于查找所选列的最小值和最大值&#xff0c;分别。以下是它们的用法和示例&#xff1a; MIN() 函数 MIN()函数返回所选列的最小值。 示例&#xff1a; 查找Products表中的最低价格&#xff1a; SELECT MIN(Price) F…

js 获取当前窗口显示的放大比例

可以获取当前窗口显示的放大比例&#xff0c;也称为设备像素比 (devicepixelratio) 。这通常用于处理高DPI (高分辨率)屏幕上的视图缩放。您可以使用window.devicePixelRatio 属性来获得当前设备像素比。 以下是一个简单的JavaScript示例&#xff0c;演示如何获取设备像素比: j…

基于猕猴Spike运动解码的不同解码方法性能对比

公开数据集中文版详细描述 参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析 参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析 …