C56-字符串拷贝函数strcpy与strnpy

一 strcpy简介

功能 :将源字符串(包括 \0)复制到目标地址。

原型:

c 复制代码
char *strcpy(char *dest, const char *src);
  • 参数:
    • dest:目标地址(需足够大)。
    • src:源字符串(以 \0 结尾)。
  • 返回值 :返回 dest 的指针。

Example:

c 复制代码
char src[] = "ABC";
char dest[10];
strcpy(dest, src); // dest 变为 "ABC"

风险 :不检查 dest 空间,可能溢出(如 src 比 dest 长)

一句话总结:快速复制字符串,但需确保目标空间足够,否则用安全替代函数。

二 封装自己的strcpy函数

  • Example:
c 复制代码
#include <stdio.h>
#include <string.h>

    //依据"strcpy"函数原型封装一个函数用于实现其功能
char *MyStrcpy(char *dest,char *string)
{   
    //正式操作前进行安全性检查
    if(dest==NULL||string==NULL)
    {
        return NULL;
    }

    //函数的主体
    char *back=dest;    //对目标指针进行保存
    while(*string!='\0')
    {
        *dest=*string;
        dest++;
        string++;
    }
    *dest='\0';
    
    return back;
}

int main()
{
    char str[128]={'\0'};
    char *p="Hello Word!";

    MyStrcpy(str,p);
    printf("%s",str);

    return 0;
}
  • Show:

三 strncpy简介

功能:安全复制字符串,限制长度防溢出

用法:

c 复制代码
char *strncpy(char *dest, const char *src, size_t n);
  • 参数:

    • dest:目标缓冲区(存储复制结果)。
    • src:源字符串(以 \0 结尾)。
    • n:最多复制的字符数(包括 \0)。
  • 返回值 :返回 dest 的指针。

  • 最多复制 n 个字符到 dest

  • 若 src 较短,剩余空间补 \0

  • 若 src 较长,不会自动加 \0

注意:

  1. 需确保 dest 足够大

  2. 建议手动补\0:

    C 复制代码
    dest[n-1] = '\0';

Example:

c 复制代码
char dest[5];
strncpy(dest, "hello", 5);
dest[4] = '\0';  // 安全终止

特点:

  • 比 strcpy 安全
  • 需自行处理字符串终止

四 封装自己的strncpy函数

  • Example:
c 复制代码
#include <stdio.h>
#include <string.h>

    //依据"strcpy"函数原型封装一个函数用于实现其功能
char *MyStrncpy(char *dest,char *string,int count)
{   
    //正式操作前进行安全性检查
    if(dest==NULL||string==NULL)
    {
        return NULL;
    }

    //函数的主体
    char *back=dest;    //对目标指针进行保存
    while(*string!='\0'&&count>0)
    {
        *dest=*string;
        dest++;
        string++;
        count--;
    }

    if(count>0)
    {
        while(count>0)
        {
            count--;
            *dest++='\0';
        }
        return dest;
    }
    *dest='\0';
    
    return back;
}

int main()
{
    char str[128]={'\0'};
    char *p="Hello Word!";

    MyStrncpy(str,p,6);
    printf("%s",str);

    return 0;
}
  • Show:
相关推荐
龙亘川1 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人1 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas1002 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
一木 之林2 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
专注仿真2 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy13 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
呆呆虫123 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心疼你的一切4 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
Zwawa5 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Wang's Blog5 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友