模拟实现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;
}
相关推荐
Hvitur7 分钟前
Java - Lambda
java·开发语言·python
xiaoye-duck13 分钟前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J17 分钟前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
希望我万事顺遂19 分钟前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode
喵了几个咪25 分钟前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang
꧁细听勿语情꧂1 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫1 小时前
【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱
数据结构·算法·leetcode
是main不是漫1 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
apcipot_rain5 小时前
C++转Java日记(06)
java·开发语言
金銀銅鐵10 小时前
带您看懂字节码指令(一):一帧里有什么
java·后端·ai编程