⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:C语言初阶
⭐代码仓库:C Advanced
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!

文章目录

  • 前言
  • 一、简介
    • 1.认识strcpy
    • 2.应用strcpy
    • 3.监视分析
  • 二、模拟实现strcpy
    • 1.初步实现
    • 2.输入空指针
    • 3.assert
    • 4.这阶段完整代码
  • 三、返回值
    • 1.返回类型
    • 2.const
  • 四、完整代码
  • 总结

前言

strcpy函数其实大家并不陌生,但是每次用的时候要么就复制到字符串的地方不对,要么就出现错误,那到底该怎么用这个函数呢?接下来我将详细给大家讲解strcpy这个函数的本质和用法!


一、简介

1.认识strcpy

再认识这个函数之前,我先放一张图片供大家理解一下:

在MSDN中查一下这个函数,发现是从后面的数组复制一份复制到前面的数组,那当然,大家伙可能会问了,为什么有一个const被圈出来了,这个const很熟悉呀,之前见到过了,大家伙继续往后看,在文中我会跟大家详细解说一下这个const与指针配套起来的用法。

2.应用strcpy

先带大家看一看运用一下strcpy的奇效。

#include<stdio.h>
#include<string.h>
int main() {char arr1[20] = "****************";char arr2[] = "hello";strcpy(arr1, arr2);printf("%s\n", arr1);   return 0;
}


看,运用了这个函数以后感觉是在是太方便了,能把arr2中的“hello\0”全部复制到arr1[20]里面去,唉,大家可能会问了,屏幕上显示的是hello啊,没有那个’\0’,大家继续往下面看,就立马能够理解了。

3.监视分析

先上几张图片让大家理解理解。

1.将*赋到arr1数组中。

2.将hello+’0’赋到arr2数组中。

3.进行复制的操作。

4.原理图

利用监视器看strcpy函数能够看到它的本质就是将后面数组里面的字符串+‘、0’拷贝到前面的数组中,但是为什么会有\0呢,这个很简单,arr[]={a,b,c,d}与arr[]="abc"是有本质的区别的,后者多一个\0,大家可以去看看我以后写的关于数组的区分的博客哦!


二、模拟实现strcpy

1.初步实现

先上个代码:

代码1:这个代码很好理解,就先取数组的首地址并交换再往后加加,直到最后一个元素进行交换完退出循环。

#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {while (*src != '\0'){*dest++ = *src++;}           *dest = *src;   //拷贝\0
}
int main() {char arr1[20] = "****************";char arr2[] = "hello";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

代码2:这个代码可以把\0直接打印出来,不需要最后一步加上交换一次\0。

#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {while (*dest++ = *src++) {;}
}
int main() {char arr1[20] = "****************";char arr2[] = "hello";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

但这代码实现的看似没什么问题,可是也隐藏着一个很大的问题,数组是我已经定义好了的,但是,如果是在主函数里面输入NULL(空指针)呢?那让我们先来看看。

2.输入空指针


输入空指针后,编译器立马就报错了,所以,这是肯定不行的!那怎么解决呢?接下来上一串代码!

子函数里加了先判断输入的两个指针元素存不存在空指针,有空指针那就不进行后续操作。

#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {if (src == NULL || dest == NULL){return;}while (*dest++ = *src++) {;}
}
int main() {char arr1[20] = "****************";char* p = NULL;my_strcpy(arr1, p);printf("%s\n", arr1);return 0;
}


大家想一个问题,如果一个程序员喝了点小酒醉了,只看到了这个程序可以直接运行,很开心的到老板那里邀功,老板说,你这做的啥!为什么导致程序员犯错了呢,很简单,机器没有报错,程序员以为是对的,所以,接下来引进一个新的函数为“断言’(assert)函数。

3.assert

assert中可以放一个表达式,表达式的结果如果为假,就报错,如果为真那就正常运行

实现代码:

#include<assert.h>
#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {/*if (src == NULL || dest == NULL){return;}*/assert(src != NULL);assert(dest != NULL);while (*dest++ = *src++) {;}
}
int main() {char arr1[20] = "****************";char* p = NULL;my_strcpy(arr1, p);printf("%s\n", arr1);return 0;
}

很明显,这个程序报错了,而且给你标注了哪里出错了,是不是很方便快捷,当然,头文件不要漏掉。

4.这阶段完整代码

这一阶段的完整代码如下:

#include<assert.h>
#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src)
{assert(dest && src);//断言指针的有效性while (*dest++ = *src++){;}
}int main()
{//strcpy - 字符串拷贝//char arr1[20] = "xxxxxxxxxxx";//char arr2[] =   "hello";//my_strcpy(arr1, arr2);//printf("%s\n", arr1);char arr3[20] = {0};char* p = NULL;my_strcpy(arr3, p);return 0;
}

三、返回值

大家如果细心看那张strcpy的图,会发现两个小问题,这strcpy是有返回值的呀,还有那个const怎么一直没有解决呢?接下来,我们开始解决问题!

1.返回类型


那接下来修改一下这个代码吧!

#include<assert.h>
#include<stdio.h>
//#include<string.h>
char* my_strcpy(char* dest, char* src)
{assert(dest && src);char* ret = dest;while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = "*************";char arr2[] = "hello";printf("%s\n", my_strcpy(arr1, arr2));  //链式访问return 0;
}

这样就有返回值了!

2.const

接下来到了最激动人心的时刻,久久困扰的const该怎么做呢?下面且听我分析。

大家先来看看这张图片,生动形象的解释了const。

情况一:const 在的左边:const int p 与 int const * p 一样哦~

//const放在* 的左边,const修饰的是指针指向的内容,表示指针指向的内容,不能通过指针来改变了; 但是指针变量本身可以修改
int num = 0;
int n = 1000;
const int* p = &num;*p = 20;//errp = &n;//ok

情况二:const 在*的右边:int * const p

 const放在*的右边,const修饰的指针变量本身,表示指针变量本身的内容不能被修改,但是指针指向的内容,可以通过指针来改变。
int* const p = &num;
*p = 20;//okp = &n;//err

到这里就完美解决了strcpy函数的问题。


四、完整代码

#include<assert.h>
#include<stdio.h>
//#include<string.h>
char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = "*************";char arr2[] = "hello";printf("%s\n", my_strcpy(arr1, arr2));  //链式访问return 0;
}

总结

模拟strcpy函数让我们大家深刻理解了这个函数的原理以及用法,最好的一点是让我们了解了assert和const的使用,一举三得!!!!

客官都阅读到这边了,码字不易,求个三连支持!

模拟strcpy库函数的实现(超详细)相关推荐

  1. 【C语言】模拟实现库函数 strcpy(复制字符串内容) 与 strlen(求字符串长度)

    前言:对于库函数的使用,我们不仅要会使用方法,更要知晓使用原理,而知晓使用原理最好的方法就是模拟相应库函数的使用. 今天我们就来模拟 strcpy(复制字符串内容) 与 strlen(求字符串长度)这 ...

  2. JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解

    目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...

  3. strcpy实现 模拟实现库函数strcpy

    strcpy实现 模拟实现库函数strcpy #include<stdio.h> #include<assert.h>char* my_strcpy(char* dest, c ...

  4. 【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

    [排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...

  5. 用Python实现问卷星自动填写(超详细!!!)

    用Python实现问卷星自动填写(超详细!!!) 前言 一.配置环境 1.1安装依赖 1.2安装驱动 二.实战处理 2.1.引入库函数 2.2.程序所需函数详解 (1)自定义单选函数 (2)自定义多选 ...

  6. SQLMap用户手册【超详细】

    SQLMap用户手册[超详细] 文章来源:http://www.cnblogs.com/hongfei/p/3872156.html ps:直接copy http://192.168.136.131/ ...

  7. 超详细 Spring Boot 知识清单

    2019独角兽企业重金招聘Python工程师标准>>> 超详细 Spring Boot 知识清单 在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许 ...

  8. rtmp测试地址_超详细搭建多码率测试环境(成为流媒体高手必经之路)

    0.引言 关注我的朋友,应该都知道,前面我们讲解了如何搭建srs流媒体服务器,链接如下.由于srs流媒体服务器是不支持多码率测试环境,所以不能在上次的环境上继续演示.那本篇文章就要给出一个新方案,就是 ...

  9. Nginx实战部署常用功能演示(超详细版),绝对给力~~~

    前言 上次分享了一些开发过程中常用的功能,但如果到真实环境中,其实还需要一些额外的配置,比如说跨域.缓存.配置SSL证书.高可用等,老规矩,还是挑几个平时比较常用的进行演示分享.上篇详见Nginx超详 ...

最新文章

  1. FPGA的设计艺术(5)STA实战之时钟偏斜对建立保持时间的影响以及时序报告分析
  2. java int parse_java中Integer.parseInt和Integer.valueOf的区别
  3. web框架应具备的功能
  4. Maven集成测试和Spring Restful Services
  5. BlueTooth 蓝牙音频音质探讨
  6. python版判断IP地址
  7. python数字图像处理(10):图像简单滤波
  8. 智慧水利大屏可视化决策系统
  9. Python 3.7.1 模块 文本处理 正则表达式 re
  10. 很全的路由器默认初始密码集合.txt_为何小企业要用企业级无线路由器?一次对比选购经历证实...
  11. 上传图片的方法(大白话讲解)
  12. win10系统崩溃怎么修复_手把手教你“无损”修复win10系统
  13. 多网卡环境下(数据网卡+有线网卡)下广播失败问题
  14. 免费录屏软件有哪些?录屏软件下载,认准这3款软件
  15. 字符串“false“转 Boolean false
  16. 卡西欧计算机怎么写入公式,casio fx 3900计算器圆弧公式的输入方法
  17. vue整合bpmn.js并汉化
  18. 跨境电商企业财务管理问题多 erp软件作用大
  19. LabVIEW编程LabVIEW开发DAQ采集消除串扰 例程与相关资料
  20. 使用Homebrew安装nvm

热门文章

  1. 简单实现对象调用:创建一个LOL中的英雄类和怪物类
  2. strncmp的介绍
  3. Intelij IDEA 2017.2安装mybatis插件并激活教程
  4. 如何将别人Google云端硬盘中的数据进行保存
  5. cmd新建文件及文件夹
  6. 博奥智源系统安全运维怎么做?
  7. ffmpeg实例,比特率码率(-b)、帧率(-r)和文件大小(-fs)相关操作
  8. 通过完整的PID传递函数例题,学会使用simulink仿真,包括:1,使用matlab仿真、2,组件子系统封装、命名等、3,通过输入不同波形,观察该系统跟踪效果对比。
  9. 【开发技巧】-- SpringBoot使用LogBook打印http请求、响应信息
  10. JS的ES5和ES6新增的方法(重点)