模拟实现库函数:strcpy

news2024/11/24 18:31:07

目录

通过cplusplus网站了解函数功能:

断言assert的使用:

关于const:

本篇你最应该了解的内容:


通过cplusplus网站了解函数功能:

要模拟实现库函数,首先我们需要了解这个函数的参数,函数的返回值,函数的功能等,我们可以通过cplusplus.com - The C++ Resources Network进行查询,经过分析可以知道:

 根据相应的要求撰写代码,里面的const后面单独说

第一版:

void my_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;// \0 的拷贝
}

int main()
{
	char arr1[] = "hello bit";
	char arr2[20] = "xxxxxxxxxxxxx";
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

经过简单分析,这里已经基本实现了函数的功能,但在库函数中,strcpy的返回值为目的数组的指针,我们进行第一次优化

第二版:

char* my_strcpy(char* dest, char* src)
{
	char* ret = dest;//保存指针初始位置,方便后面返回值
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;// \0 的拷贝
	return ret;
}

int main()
{
	char arr1[] = "hello bit";
	char arr2[20] = "xxxxxxxxxxxxx";
	printf("%s\n", my_strcpy(arr2, arr1));
	return 0;
}

需要注意的是:由于在后面拷贝过程中,src与dest指针一直在改变位置,为了最后可以返回目的字符串,我们需要在改变指针之前保存目的字符串的起始位置。

断言assert的使用:

对于strcpy函数而言,为了函数的安全性,我们要避免传参时为空指针,这时我们可以引入断言的概念,在使用断言时需要引用头文件assert.h,具体的使用方法为assert(要求),例如本题,我们可以这样使用assert(dest!=NULL),如果assert发现此时不满足括号内的条件,assert就会报错,保证了函数的安全性,避免函数出现未知错误。

第三版:

#include<assert.h>

char* my_strcpy(char* dest, char* src)
{
    //断言
    assert(dest!=NULL);
    assert(src!=NULL);
	char* ret = dest;//保存指针初始位置,方便后面返回值
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;// \0 的拷贝
	return ret;
}

int main()
{
	char arr1[] = "hello bit";
	char arr2[20] = "xxxxxxxxxxxxx";
	printf("%s\n", my_strcpy(arr2, arr1));
	return 0;
}

关于const:

 概念如下:

 举几个例子大家就明白了:

void test1()
{
	int n = 10;
	int m = 20;
	int* p = &n;
	*p = 20;//ok
	p = &m;//ok
}

void test2()
{
	int n = 10;
	int m = 20;
	const int* p = &n;//const放在*前,表示指针p指向的内容不可以被修改,但指针p不影响
	*p = 20;//err
	p = &m;//ok
}

void test3()
{
	int n = 10;
	int m = 20;
	int* const p = &n;//const放在*后,表示指针p不可以被修改,但指针p指向的内容不影响
	*p = 20;//ok
	p = &m;//err
}

了解了const的用法,我们可以进行再次优化。

第四版:

#include<assert.h>

char* my_strcpy(char* dest, const char * src)
{
	char* ret = dest;
	//断言
	assert(dest != NULL);
	assert(src != NULL);

	while (*dest++ = *src++) 
		;//空语句
	return ret;
}


int main()
{
	char arr1[] = "hello bit";
	char arr2[20] = "xxxxxxxxxxxxx";
	printf("%s\n", my_strcpy(arr2, arr1));
	return 0;
}

本篇你最应该了解的内容:

(1)assert断言的使用,学习过断言的使用,建议在以后可以应用起来,可以避免函数出现一些意想不到的错误,直接了当的找到bug。

(2)const的使用,巧妙使用const,可以保护一些你不希望被改变的值。

(3)cplusplus等网站的使用,可以查询库函数。

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

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

相关文章

主机加固介绍

最近公司做服务器安全&#xff0c;开始在市场了解产品&#xff0c;对这一块算是短暂的研究了一段时间&#xff0c;有一点心得给大家分享一下。 主机加固 最近主机加固的概念被炒得火热&#xff0c;主机加固的功能也正在被致力于服务器安全的相关人士所关注。 那么究竟什么是主…

【CVPR2022】CSWin Transformer详解

【CVPR2022】CSWin Transformer详解 0. 引言1. 网络结构2. 创新点2.1 Cross-Shaped Window Self-Attention2.2 Locally-Enhanced Positional Encoding(LePE) 3. 实验总结 0. 引言 Transformer设计中一个具有挑战性的问题是&#xff0c;全局自注意力的计算成本非常高&#xff0…

chatgpt赋能python:Python代码怎么敲:了解Python编程语言

Python代码怎么敲&#xff1a;了解Python编程语言 Python是一种高级编程语言&#xff0c;具有易读易用和高效性等优点。这使得Python成为了程序员的最佳选择&#xff0c;并成为了广泛应用于机器学习、Web开发、数据分析等领域。 Python代码敲法&#xff1a;小技巧 Python代码…

chatgpt赋能python:Python主要语句介绍

Python主要语句介绍 Python是一种广泛使用的高级编程语言&#xff0c;其语法简介、易于学习&#xff0c;并有丰富的库和工具支持。在Python中&#xff0c;主要的语句可以帮助开发人员快速编写代码&#xff0c;实现各种各样的任务。在本文中&#xff0c;我们将介绍Python中的主…

性能优化之高Log file sync等待实战案例分享

故障情况 AWR报告如下&#xff1a; 之后他们把大部分业务停掉后&#xff0c;Log file sync等待事件还是非常高。 通过对比昨天跟今天相同时间的AWR&#xff0c;在业务量小非常多的情况&#xff0c;等待时间还是高非常大。 诊断过程 log file sync等待事件首先判断当前系统IO…

“微商城”项目(1环境搭建)

开发工具分享&#xff1a; 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1lSsCjf-_zx1ymu6uZeG26Q?pwdhuan 提取码&#xff1a;huan 一、环境搭建说明 本项目服务端环境要求为 Windows Apache PHP MySQL。 下面介绍如何搭建环境&#xff0c;部署服…

CW32系列模数转换器(ADC)

模数转换器&#xff08;ADC&#xff09;的主要功能是将模拟量转换为数字量&#xff0c;方便MCU进行处理。下面以CW32L083为例介绍CW系列的模数转换器的特点和功能&#xff0c;并提供演示实例。 一、概述 CW32L083 内部集成一个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模…

位操作符的应用

目录 位操作符的概念&#xff1a; 一、&&#xff08;按位与&#xff09;&#xff1a;两个整数的补码对应的二进制位有0则为0&#xff0c;两个同时为1才为1&#xff0c;得到的数仍为补码。 二、|&#xff08;按位或&#xff09;&#xff1a;两个整数的补码对应的二进制位…

Effective第三版 中英 | 第2章 创建和销毁对象 | 当面临多个参数的构造器时考虑使用构建器

文章目录 Effective第三版前言第2章 创建和销毁对象当面临多个参数的构造器时考虑使用构建器 Effective第三版 前言 大家好&#xff0c;这里是 Rocky 编程日记 &#xff0c;喜欢后端架构及中间件源码&#xff0c;目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔…

【KKT】∇f(x)+λ∇g(x)=0中λ的讨论

Karush-Kuhn-Tucker (KKT)条件 〇、问题背景 在阅读 Karush-Kuhn-Tucker (KKT)条件 时&#xff0c;不太能理解 ∇ f \nabla f ∇f 的方向&#xff0c;以及 ∇ g \nabla g ∇g 的方向&#xff1a; 为什么 ∇ f \nabla f ∇f 是指向可行域内部&#xff0c; ∇ g \nabla g ∇g…

Java多线程方面知识

目录 1.程序、进程、线程 2.进程与线程的内存解析 3.并发与并行 4.Java程序的线程 5.多线程的创建&#xff1a;方式一&#xff1a;继承于Thread类 6.start方法的作用 7.使用start()时要注意的问题 8.Thread类中的一些方法 9.线程的优先级 10.多线程的创建&#xff1a…

【JAVA】清缓存(打断点删除 / 新增表或字段无效)

一. 打断点无效 情景 新写了一个获取列表数据接口&#xff0c;前端调用的&#xff0c;获取到的数据为空数组。在数据库中查看&#xff0c;是有数据的&#xff0c;但是调用接口返回数据为空。接下来就打断点啦&#xff0c;发现无效&#xff01;表现如下 没有可执行的…

【Bio】牙的分类

文章目录 IncisorCentral IncisorLateral Incisor Canine / CuspidPremolarFirst PremolarSecond Premolar MolarFirst MolarSecond MolarThird Molar / Wisdom Tooth Ref Incisor Central Incisor Lateral Incisor Canine / Cuspid Premolar First Premolar Second Prem…

第六十二天学习记录:C语言进阶:C语言预处理2

带副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候&#xff0c;如果参数带有副作用&#xff0c;那么你在使用这个宏的时候就可能出现危险&#xff0c;导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。例如&#xff1a; x1;//不带副作用 x;//带有副作…

安全认证:

1. 认证概述 为什么要有认证&#xff1f; 防止非法路由器接入企业内网的ospf路由器&#xff0c;保护内网安全 2. 认证方式 认证方式分为接口认证和区域认证&#xff0c;接口认证和区域认证没有本质的区别&#xff0c;接口认证是当区域内链路过多的情况下&#xff0c;接口认证…

Java网络开发(Tomcat)—— Servlet学习 Web相关背景知识 JavaWeb项目初步

本文目录 引出一、软件架构BS和CS二、实现Web服务的条件和步骤三、Tomcat搭建Web项目初步1.pom.xml文件配置2.web.xml文件更新3.Tomcat运行环境配置4.项目文件层级解析 四、JavaWeb项目文件分类&#xff08;1&#xff09;静态文件—存放位置&#xff08;2&#xff09;动态文件-…

【用人话讲算法】leetcode无重复字符的最长子串

【用人话讲算法】leetcode无重复字符的最长子串 文章目录 【用人话讲算法】leetcode无重复字符的最长子串题目简单思路&#xff08;暴力&#xff09;优化思考怎么写代码&#xff1f;怎么到下一个&#xff1f;whilefor 思路总结while和for循环总结 题目 题目的意思是说&#xff…

一台电脑上安装多个版本的python,运行互不干扰,显示位置的一些命令,

首先需要知道一些命令&#xff1a; pip show 包名 可以使用pip show 包名的方式显示位置 pip list pip方式显示的是当前环境下的库 os.environ.get&#xff08;&#xff09; python中os模块获取环境变量的一个方法 Python os.environ.get&#xff08;&#xff09;的用法 …

使用Git LFS上传Unity大型资源文件

在使用Unity制作结课作业时&#xff0c;使用到git工具进行版本控制与多人协作。在提交项目至远程仓库的过程中&#xff0c;git bash提示了以下报错&#xff1a; remote: warning: File Assets/Models/Z_India_5.29.fbx is 57.31 MB; this is larger than GitHubs recommended m…

利用环回口建立IBGP邻居

利用环回口建立IBGP邻居 BGP的稳定性 IBGP : 1.一般使用环回口建立IBGP邻居 2.指定建立IBGP邻居的源地址为lookback地址 EBGP : 1.一般使用直连接口建立EBGP邻居关系 2.如果想使用环回口建立EBGP邻居&#xff0c;需要将TTL值修改为大于1&#xff0c;默认TTL1 修改命令…