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

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

相关推荐
l1t2 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
再见晴天*_*3 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
l1t3 小时前
利用美团龙猫用libxml2编写XML转CSV文件C程序
xml·c语言·libxml2·解析器
lqjun08274 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge6 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘6 小时前
39.网络流入门
开发语言·网络·c++·算法
未来之窗软件服务7 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
西红柿维生素7 小时前
JVM相关总结
java·jvm·算法
小冯记录编程7 小时前
C++指针陷阱:高效背后的致命危险
开发语言·c++·visual studio
1uther7 小时前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎