手动实现strcpy

手动实现 strcpy 函数

strcpy 函数的核心功能是将源字符串(以 '\0' 结尾)复制到目标空间。实现时需注意:

  1. 处理指针合法性(避免空指针)

  2. 确保目标空间足够大

  3. 包含字符串结束符 '\0'

以下是实现代码:

#include <stdio.h>

#include <assert.h>

// 自定义 strcpy 函数

char* my_strcpy(char* dest, const char* src) {

// 断言:确保目标和源指针非空

assert(dest != NULL && src != NULL);

char* ret = dest; // 保存目标指针初始地址,用于返回

// 展开循环步骤

while (1) { // 无限循环,通过内部条件退出

*dest = *src; // 1. 复制当前字符

if (*src == '\0') { // 2. 检查是否到达源字符串末尾

break; // 遇到 '\0' 时退出循环

}

dest++; // 3. 目标指针后移

src++; // 4. 源指针后移

}

return ret; // 返回目标字符串指针

}

// 测试函数

int main() {

char dest100 = {0};

const char* src = "Hello, World!";

printf("源字符串: %s\n", src);

my_strcpy(dest, src);

printf("复制后: %s\n", dest);

return 0;

}

代码解析

核心逻辑

  • 指针断言:通过 assert 确保输入指针有效,避免空指针异常。

  • 赋值循环: *dest++ = *src++ 先将源字符复制到目标位置,再同时移动两个指针。当 *src 为 '\0' 时,赋值给 *dest 并终止循环,确保目标字符串以 '\0' 结尾。

  • 返回值:返回目标指针初始地址,实现类似标准库 strcpy 的链式调用(如 strcpy(a, strcpy(b, c)) )。

安全注意事项

  • 实际使用时,需确保 dest 指向的空间足够大,否则会导致缓冲区溢出。

  • 若需增强安全性,可结合 strlen(src) + 1 提前计算空间需求(+1 为 '\0' 预留位置)。

与标准库的兼容性

此实现与 C 标准库 strcpy 的行为一致,但生产环境中建议优先使用标准库函数,并配合 strncpy 等安全版本避免风险。

相关推荐
Chester_19994 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
裕晟资质规划5 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
EXI-小洲5 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员6 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导6 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan6 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子6 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化6 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_695251496 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
是隼人7 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门