模拟实现strcpy(字符串拷贝)(C语言)

C 库函数 - strcpy()

描述

c 复制代码
char *strcpy(char *dest, const char *src) 

把 src 所指向的字符串复制到 dest。

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。

声明

下面是 strcpy() 函数的声明:

c 复制代码
char *strcpy(char *dest, const char *src)

参数

dest -- 指向用于存储复制内容的目标数组。

src -- 要复制的字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

模拟实现

1.0

c 复制代码
void my_strcpy(char* dest, char* src)//版本一
{
	while (*src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
	}
	*dest = *src;
}

2.0

c 复制代码
// 满足递进关系与后置++,简化代码
//(缺点,指针解引用前无保护)
void my_strcpy(char* dest, char* src)
{
	while (*dest++ = *src++)  //'\0' 为假,控制循环
		;
}

3.0

c 复制代码
//优化三:在解引用指针前,判断指针的有效性(必须)
//(虽防止出现野指针,但没提示出哪里出错)
void my_strcpy(char* dest, char* src)
{
	if (src != NULL&&dest != NULL)
	{
		while (*dest++ = *src++)
			;
	}
}

4.0

c 复制代码
//编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。
#include<assert.h>
void my_strcpy(char* dest, char* src)//法四:断言法(在保护的基础上,告诉错误在哪)
{
	assert(dest != NULL);           //fail(失败,不成功)
	assert(src != NULL);
	if (src != NULL){
		while (*dest++ = *src++);
	}
}

5.0

c 复制代码
#include <assert.h>
#include <stddef.h> // 引入 NULL 定义

char* my_strcpy(char* dest, const char* src) 
{
    // 1. 断言:只在 Debug 下检查,暴露写代码的人的 Bug
    assert(dest != NULL);
    assert(src != NULL);

    // 2. 标准库行为:如果传入 NULL,未定义行为,我们让它在 Release 下直接崩溃(而非静默)
    // 实际上 assert 在 Release 下被剥离,所以如果有风险,可在 Release 下加条件判断主动崩溃
    if (dest == NULL || src == NULL) {
        return NULL; // 或者 abort(); 但绝不能静默复制!
    }

    char* ret = dest;

    // 3. 复制(内存重叠不考虑,那是 memmove 的事)
    while (*dest++ = *src++) 
        ;

    return ret;
}
相关推荐
不是万能的豆学长3 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
时间静止不是简史3 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428046 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
懂点Tech7 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
徐小夕8 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao8 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
金銀銅鐵8 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin8 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
福建佰胜张工9 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
念何架构之路9 小时前
go-grpc设计思想
开发语言·后端·golang