当前位置: 首页 > news >正文

C56-亲自实现字符串拷贝函数

一 strcpy简介

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

原型

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

示例

char src[] = "ABC";
char dest[10];
strcpy(dest, src); // dest 变为 "ABC"

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

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

二 封装自己的strcpy函数

  • 代码示例:
#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;
}
  • 成果展示:

image-20250531184324253

三 strncpy简介

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

用法

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

    dest[n-1] = '\0';
    

示例

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

特点

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

四 封装自己的strncpy函数

  • 代码示例:
#include <stdio.h>
#include <string.h>//依据"strncpy"函数原型封装一个函数用于实现其功能
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;
}
  • 成果展示:

image-20250531191052594

相关文章:

  • [学习] RTKlib 实用工具介绍
  • 第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型
  • MonitorSDK_性能监控(从Web Vital性能指标、PerformanceObserver API和具体代码实现)
  • 3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云
  • 8086 处理器 Flags 标志位全解析:CPU 的 “晴雨表” 与 “遥控器”总结:
  • 【Docker系列】Docker 容器内安装`ps`命令
  • RFID技术深度剖析:从原理、协议到S50卡与FM17550读写
  • TI MSPM0G3507 简易PID项目显示和按键控制
  • C++语法系列之模板进阶
  • 【C#】一个简单的http服务器项目开发过程详解
  • MySQL备份工具:mysqldump
  • leetcode hot100刷题日记——33.二叉树的层序遍历
  • 单例模式的类和静态方法的类的区别和使用场景
  • Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】
  • Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
  • 关于 java:3. Java 常用类库与数据结构
  • Spark核心:单跳转换率计算全解析
  • 【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】
  • 跟我学c++中级篇——隐式转换的意义
  • 使用 Let‘s Encrypt 和 Certbot 为 Cloudflare 托管的域名申请 SSL 证书
  • 设计工作室网站源码/关键词完整版免费听
  • 深圳高端网站制作多少钱/成都百度百科
  • 网站源文件/泰州seo公司
  • 申请电子邮箱免费注册/成都高薪seo
  • 动态网站与静态网站区别/seo基础知识
  • 纪委网站微信建设/天津百度网站排名优化