不调用C++/C的字符串库函数,编写函数strcpy

一、完整的 strcpy 实现代码

cpp 复制代码
// 实现strcpy:将strSrc拷贝到strDest,返回strDest(兼容库函数原型)
char* strcpy(char* strDest, const char* strSrc)
{
    // 1. 健壮性校验:空指针直接返回(或根据需求抛异常,C风格常用返回NULL)
    if (strDest == nullptr || strSrc == nullptr)
    {
        return nullptr; 
    }

    // 2. 保存目标字符串起始地址(用于最后返回)
    char* pDest = strDest;

    // 3. 逐字节拷贝:直到遇到源字符串的结束符'\0'
    while (*strSrc != '\0')
    {
        *strDest = *strSrc; // 拷贝当前字符
        strDest++;          // 目标指针后移
        strSrc++;           // 源指针后移
    }

    // 4. 关键:给目标字符串末尾补'\0'(字符串的核心标志)
    *strDest = '\0';

    // 5. 返回目标字符串起始地址(兼容库函数的返回值设计)
    return pDest;
}

// 测试用例(验证功能)
#include <iostream>
int main()
{
    // 测试1:正常拷贝
    char dest1[20] = {0}; // 初始化避免脏数据
    const char* src1 = "hello strcpy";
    strcpy(dest1, src1);
    std::cout << "正常拷贝结果:" << dest1 << std::endl; // 输出:hello strcpy

    // 测试2:源字符串为空
    char dest2[20] = {0};
    const char* src2 = "";
    strcpy(dest2, src2);
    std::cout << "空字符串拷贝结果:" << (dest2[0] == '\0' ? "空字符串" : "非空") << std::endl; // 输出:空字符串

    // 测试3:空指针(验证健壮性)
    char* dest3 = nullptr;
    const char* src3 = "test null";
    char* res = strcpy(dest3, src3);
    std::cout << "空指针拷贝结果:" << (res == nullptr ? "返回NULL" : "非NULL") << std::endl; // 输出:返回NULL

    return 0;
}

二、核心逻辑拆解

  1. 空指针校验 这是工业级代码的必备逻辑 ------ 如果strDest或strSrc是NULL,直接返回NULL,避免程序崩溃(新手常忽略这一步,只写拷贝逻辑)。也可以用assert(strDest && strSrc);(断言),调试阶段快速发现空指针问题,但断言在 Release 模式下会失效,所以空指针判断更通用。

  2. 保存起始地址 因为拷贝过程中strDest会不断后移,需要先用pDest记住原始起始位置,最后返回(和库函数strcpy的行为一致)。

  3. 逐字节拷贝

    • *strSrc表示取strSrc指针指向的当前字符;
    • 循环条件*strSrc != '\0':字符串的结束标志是'\0',只要没到末尾就继续拷贝;
    • 每次拷贝后,两个指针都向后移动一位(strDest++/strSrc++)。
  4. 末尾补 '\0' 这是最容易踩坑的点!源字符串的'\0'不会被循环拷贝(循环到'\0'就终止了),必须手动给目标字符串加'\0',否则目标字符串会变成 "乱码"(因为找不到结束符)。

相关推荐
程序猿编码5 分钟前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
西飘客1 小时前
vs 怎么根据dll 生成lib文件
c++·qt
bkspiderx2 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆2 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光2 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园2 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西3 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨3 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
SuperByteMaster4 小时前
wfi进入之前没有清除basepri, 导致中断优先级不够,wfi 退不出来
c语言
徐小黑ACG4 小时前
Golang 基础05 结构体struct
开发语言·算法·golang