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;
}

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

相关推荐
sg_knight7 分钟前
如何实现“秒传”与“断点续传”?MinIO + Java 实战进阶篇
java·开发语言·文件管理·minio·ftp·oss·文件传输
William Dawson7 分钟前
Java 后端高频 20 题超详细解析 ②
java·开发语言
SteveSenna8 分钟前
强化学习4.1:基于价值——Q-learning
人工智能·学习·算法·机器人
少许极端10 分钟前
算法奇妙屋(四十四)-贪心算法学习之路11
java·学习·算法·贪心算法
子琦啊10 分钟前
【算法复习】数组与双指针篇
javascript·算法
ambition2024212 分钟前
斐波那契取模问题的深入分析:为什么提前取模是关键的
c语言·数据结构·c++·算法·图论
艾莉丝努力练剑13 分钟前
C++ 核心编程练习:从基础语法到递归、重载与宏定义
linux·运维·服务器·c语言·c++·学习
夜珀18 分钟前
OpenTiny NEXT 从入门到精通·第 4 篇
开发语言
小樱花的樱花23 分钟前
1 项目概述
开发语言·c++·qt·ui
逆境不可逃26 分钟前
LeetCode 热题 100 之 230. 二叉搜索树中第 K 小的元素 199. 二叉树的右视图 114. 二叉树展开为链表
算法·leetcode·职场和发展