在本篇博客中,我们是通过对模拟实现strcpy函数my_strcpy的不断优化进行的,最终优化代码为最后一次代码。

目录

一、strcpy函数的介绍

二、strcpy函数实现字符串拷贝的示例

2.1 代码

2.2 运行结果

2.3 测试是否拷贝'\0'

​编辑

三、模拟实现strcpy

3.1 初步模拟(粗糙版)

3.1.1 问题分析

3.2 完善版

3.2.1 代码实现

3.2.2 运行结果


一、strcpy函数的介绍

strcpy,即string copy(字符串复制)的缩写。

strcpy函数是C/C++语言的一个标准函数 [1]  ,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*,例如strcpy(arr1,arr2);即为把数组arr2的内的字符串,复制到arr1中,注意:在字符串拷贝的过程中,'\0'也会被拷贝。

二、strcpy函数实现字符串拷贝的示例

2.1 代码

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

2.2 运行结果

2.3 测试是否拷贝'\0'

打开调试,在监视窗口,我们会发现strcpy在字符串拷贝时,会把'\0'拷贝过去。

三、模拟实现strcpy

3.1 初步模拟(粗糙版)

3.1.1 问题分析

我们要模拟实现strcpy函数,strcpy函数的基本原理如下图:

接下来我们就可以看图写代码了。

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

在某些时候,我们可能将my_strcpy处的指针传错,传成空指针,这种情况如何避免呢?我们可以使用一个库函数assert,当assert(),括号中可以放一个表达式,当表达式为假时就会报错。在上面的代码我们可以对一些部分进行完善,完善后的结果是:

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

3.2 完善版

我们发现在strcpy的官方解释中:

我们发现strcpy函数的参数类型和返回类型与我们设计的my_strcpy都不相同,那么为什么在strcpy函数设计初始会这样设计呢?

如果在上述代码*dest++ = *src++中,如果我们把dest和src写反了,程序会报错,那么如何避免这种问题,我们可以在*src前面加上const,这样就增加了代码的健壮性,其次在strcpy函数中返回的类型是char*类型,即函数返回的是目标空间的起始地址。下面我们按照strcpy函数尝试设计my_strcpy函数:

3.2.1 代码实现

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

3.2.2 运行结果

strcpy函数的模拟实现相关推荐

  1. Strcpy函数和Strncpy函数

    strcpy函数详解 strcpy函数原型 char *strcpy( char *strDestination, const char *strSource); 库函数下的strcpy #inclu ...

  2. C语言 模拟实现 strlen strcat strcpy函数

    strlen函数 库函数strlen:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0' ...

  3. C语言strcpy函数模拟实现,未优化和已优化

    strcpy函数作用是把一个地址后面的字符串拷贝到另一个地址后面,因为字符串后面要加'\0',所以'\0'也要拷贝 //strcpy模拟实现①代码未优化时 #include<stdio.h> ...

  4. 模拟实现strlen,strcpy函数

    模拟实现strlen,strcpy函数 strlen 是计算机C语言函数,计算字符串s的(unsigned int型)长度,不包括'\0'在内.strlen所作的仅仅是一个计数器的工作,它从内存的某个 ...

  5. C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()

    C语言函数: 字符串函数及模拟实现strtok().strstr().strerror() strstr()函数: 作用:字符串查找.在一串字符串中,查找另一串字符串是否存在. 形参: str2在st ...

  6. C语言——字符串+内存函数及其模拟实现

    目录 0. 思维导图 1. 前言 2. 函数介绍 2.1 strlen 2.2 strcpy 2.3 strcat 2.4 strcmp 2.5 strncpy 2.6 strncat 2.7 str ...

  7. strtok函数及其模拟

    1.strtok函数的参数和返回值 参数:第一个参数指定一个字符串,它包含了0个或者多个由del字符串中一个或者多个分隔符分割的标 记. 第二个参数del参数是个字符串,定义了用作分隔符的字符集合. ...

  8. strcpy函数和strcat函数的使用及实现

    关于strcpy函数和strcat函数的使用.实现 一.strcpy函数 1.1代码展现 1.2注意要点 1.2.1源字符串必须以\0结束 1.2.2会将源字符串中的\0拷贝到目标空间 1.2.3目标 ...

  9. 字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数

    目录: 1.字符串函数strlen (1)strlen函数 (2)strlen的使用 a.代码 b.运行结果 (3)模拟实现strlen函数 a.代码 b.运行结果 (4)注意: 2.字符串函数str ...

最新文章

  1. Hyperledger Fabric(术语表)
  2. ViewPager onPageChangeListener总结
  3. (error) CROSSSLOT Keys in request don‘t hash to the same slot 解决方法
  4. html连在一起的选择器,请问关于css选择器的问题:两个类选择器连在一起是什么意思?...
  5. Java 8中的java.util.Random
  6. vim 编程常用的指令和快捷键
  7. JS将各值拼接JSON串小例
  8. “鉴定一下网络热门平台上的小广告”
  9. 逐步创建ASP.NET Core 2.2应用程序
  10. sql 单表/多表查询去除重复记录
  11. WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)
  12. C# Stream 和 byte[] 之间的转换[转]
  13. 分别使用御剑工具和dirsearch工具(需要在kali下进行安装)对http://159.75.16.25进行扫描, 扫描出敏感文件,敏感文件内有flag值
  14. 使用DisUnity解包unity资源文件
  15. 什么是偏振光和UV光?
  16. java制作oa审批流程,传智播客JAVA培训OA项目 审批流转模块
  17. qlv转mp4出来没有画面
  18. 脱壳之压缩壳-FSG
  19. 狂神说Spring学习笔记————(一发入魂)
  20. JavaScript 日期操作我不知道的事情

热门文章

  1. 电脑连到wifi 后,电脑上看到已连接wifi名字后面多个数字2并且电脑无法上网问题
  2. 组合导航算法(一)之捷联惯导更新及组合模式
  3. 电脑店U盘PE系统取消赞助商主页、软件的方法
  4. 全志A33开发板编译buildroot-2020.02.3
  5. RealLanSee 同步多端口局域网屏幕监控系统(极好用低占用!)
  6. 2017年深度学习在NLP领域的进展和趋势
  7. 浅谈在XXX公司的职业经历
  8. ICRA 2023 | 最新激光雷达-相机联合内外参标定,一步到位!
  9. 李居明风水人人都懂版之十二~缺角
  10. 中控,I/O端口,继电器,红外接口,编码器,解码器,主机,名词解释