strcpy函数的模拟实现
在本篇博客中,我们是通过对模拟实现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函数的模拟实现相关推荐
- Strcpy函数和Strncpy函数
strcpy函数详解 strcpy函数原型 char *strcpy( char *strDestination, const char *strSource); 库函数下的strcpy #inclu ...
- C语言 模拟实现 strlen strcat strcpy函数
strlen函数 库函数strlen:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0' ...
- C语言strcpy函数模拟实现,未优化和已优化
strcpy函数作用是把一个地址后面的字符串拷贝到另一个地址后面,因为字符串后面要加'\0',所以'\0'也要拷贝 //strcpy模拟实现①代码未优化时 #include<stdio.h> ...
- 模拟实现strlen,strcpy函数
模拟实现strlen,strcpy函数 strlen 是计算机C语言函数,计算字符串s的(unsigned int型)长度,不包括'\0'在内.strlen所作的仅仅是一个计数器的工作,它从内存的某个 ...
- C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()
C语言函数: 字符串函数及模拟实现strtok().strstr().strerror() strstr()函数: 作用:字符串查找.在一串字符串中,查找另一串字符串是否存在. 形参: str2在st ...
- 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 ...
- strtok函数及其模拟
1.strtok函数的参数和返回值 参数:第一个参数指定一个字符串,它包含了0个或者多个由del字符串中一个或者多个分隔符分割的标 记. 第二个参数del参数是个字符串,定义了用作分隔符的字符集合. ...
- strcpy函数和strcat函数的使用及实现
关于strcpy函数和strcat函数的使用.实现 一.strcpy函数 1.1代码展现 1.2注意要点 1.2.1源字符串必须以\0结束 1.2.2会将源字符串中的\0拷贝到目标空间 1.2.3目标 ...
- 字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数
目录: 1.字符串函数strlen (1)strlen函数 (2)strlen的使用 a.代码 b.运行结果 (3)模拟实现strlen函数 a.代码 b.运行结果 (4)注意: 2.字符串函数str ...
最新文章
- Hyperledger Fabric(术语表)
- ViewPager onPageChangeListener总结
- (error) CROSSSLOT Keys in request don‘t hash to the same slot 解决方法
- html连在一起的选择器,请问关于css选择器的问题:两个类选择器连在一起是什么意思?...
- Java 8中的java.util.Random
- vim 编程常用的指令和快捷键
- JS将各值拼接JSON串小例
- “鉴定一下网络热门平台上的小广告”
- 逐步创建ASP.NET Core 2.2应用程序
- sql 单表/多表查询去除重复记录
- WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)
- C# Stream 和 byte[] 之间的转换[转]
- 分别使用御剑工具和dirsearch工具(需要在kali下进行安装)对http://159.75.16.25进行扫描, 扫描出敏感文件,敏感文件内有flag值
- 使用DisUnity解包unity资源文件
- 什么是偏振光和UV光?
- java制作oa审批流程,传智播客JAVA培训OA项目 审批流转模块
- qlv转mp4出来没有画面
- 脱壳之压缩壳-FSG
- 狂神说Spring学习笔记————(一发入魂)
- JavaScript 日期操作我不知道的事情
热门文章
- 电脑连到wifi 后,电脑上看到已连接wifi名字后面多个数字2并且电脑无法上网问题
- 组合导航算法(一)之捷联惯导更新及组合模式
- 电脑店U盘PE系统取消赞助商主页、软件的方法
- 全志A33开发板编译buildroot-2020.02.3
- RealLanSee 同步多端口局域网屏幕监控系统(极好用低占用!)
- 2017年深度学习在NLP领域的进展和趋势
- 浅谈在XXX公司的职业经历
- ICRA 2023 | 最新激光雷达-相机联合内外参标定,一步到位!
- 李居明风水人人都懂版之十二~缺角
- 中控,I/O端口,继电器,红外接口,编码器,解码器,主机,名词解释