C语言——模拟实现strcpy

首先我们先学习一下strcpy是怎么用的

复制代码
#include <string.h>

int main()
{
	char arr1[] = "hello world";
	char arr2[30] = { 0 };

	strcpy(arr2, arr1);

	printf("%s", arr2);

	return 0;
}

现在我们就要思考如何模拟实现了

代码的初步实现非常简单哈~

复制代码
char* my_strcpy(char* dest,const char* src)
{
	while (*src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
	}
	*dest = *src;
}

第一步优化:

复制代码
char* my_strcpy(char* dest, const char* src)
{
	while (*src != '\0')
	{
		*dest++ = *src++;//后置++可以简化
	}
	*dest = *src;
}

再次优化:

复制代码
char* my_strcpy(char* dest, const char* src)
{
	while (*dest++ = *src++)//等\0赋值过去,表达式为0,判断为假
	{
		;
	}
}

最后我们还能加入断言,限制传来的不能是空指针

复制代码
char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest++ = *src++)
	{
		;
	}
}

不过断言其实也有简化写法

复制代码
char* my_strcpy(char* dest, const char* src)
{
	assert(dest);//如果是空指针,就是0,直接为假,就会报警
	assert(src);
	while (*dest++ = *src++)
	{
		;
	}
}

或者再简写:

复制代码
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//有一个为假就报警

	while (*dest++ = *src++)
	{
		;
	}
}

最后把返回值补充一下,库函数会返回目标空间的起始地址,实际上返回的就是dest

那我们就需要提前存一份

复制代码
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);

	char* ret = dest;//提前存一份

	while (*dest++ = *src++)
	{
		;
	}
    return ret;
}

这样模拟实现就非常精简高效的实现了

相关推荐
偷光35 分钟前
浏览器中的隐藏IDE: Elements (元素) 面板
开发语言·前端·ide·php
DKPT39 分钟前
JVM栈溢出和堆溢出哪个先满?
java·开发语言·jvm·笔记·学习
胡小禾43 分钟前
JDK17和JDK8的 G1
jvm·算法
胖咕噜的稞达鸭3 小时前
算法入门:专题攻克一---双指针(3)有效三角形的个数 查找总价格为目标值的两个商品(剑指offer题目)
算法
gopyer4 小时前
180课时吃透Go语言游戏后端开发6:Go语言的循环语句
开发语言·游戏·golang·循环语句
楼田莉子7 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习
逻辑留白陈7 小时前
Adaboost进阶:与主流集成算法对比+工业级案例+未来方向
算法
Learn Beyond Limits7 小时前
Mean Normalization|均值归一化
人工智能·神经网络·算法·机器学习·均值算法·ai·吴恩达
天选之女wow8 小时前
【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
算法·leetcode·贪心算法
Gohldg8 小时前
C++算法·贪心例题讲解
c++·数学·算法·贪心算法