模拟实现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;
}
相关推荐
Benny_Tang1 小时前
「雅礼集训 2018 Day7」A 题解
数据结构·c++·算法
IT毕设实战小研1 小时前
基于大数据的跨国外派人员适应满意度与留存影响因素可视化分析
android·java·大数据·python·django·课程设计
letisgo51 小时前
JAVA 高级进阶10篇《消息队列实战:RocketMQ/Kafka选型与“不丢不重有序“三连解》
java·面试·kafka·消息队列·rocketmq
Doubbbbbbble云1 小时前
跳表结构在高并发系统中的应用与优势分析4
算法
2401_850481171 小时前
UVA101
java
TAN-90°-1 小时前
Deep Learning for Computer Vision——Large Scale Distributed Training
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·语言模型
PHP实战开发录1 小时前
PHP接口超时后为什么任务还在跑
开发语言·前端·php·开发
m0_734571761 小时前
深入理解C++ 构造函数<十一> initializer_list 构造
开发语言·c++
Lyyaoo.1 小时前
【回溯】【中等】全排列
java·数据结构·算法