strcpy函数实现
strcpy函数实现
strcpy函数的原型为:char* strcpy(char* _Dest, const char* _Source);
//实现1
char * strcpy(char* _Dest, const char* _Source)
{//检查传入参数的有效性assert(NULL != _Dest);assert(NULL != _Source);if (NULL ==_Dest || NULL == _Source)return NULL;char* ret = _Dest;while((*_Dest++ = *_Source++) != '\0') ;return ret;
}//实现2
char * strcpy(char* _Dest, const char* _Source)
{//检查传入参数的有效性assert(NULL != _Dest);assert(NULL != _Source);if (NULL ==_Dest || NULL == _Source)return NULL;char* ret = _Dest;int i = 0;for (i = 0; _Source[i] != '\0'; i++){_Dest[i] = _Source[i];}_Dest[i] = '\0';return ret;
}
解析:
- 为什么要返回char*类型;
为了实现链式连接。返回内容为指向目标内存的地址指针,这样可以在需要字符指针的函数中使用strcpy,例如strlen(strcpy(str1, str2))。 - 源地址和目标地址出现内存重叠时,如何保证复制的正确性;
调用c运行库strcpy函数,发现即使是内存重叠,也能正常复制,但是上面的实现就不行。说明,c运行库中strcpy函数实现,还加入了检查内存重叠的机制,下面是参考代码:
//my_memcpy实现重叠内存转移
char* my_memcpy(char* _Dest, const char* _Source, int count)
{//检查传入参数的有效性assert(NULL != _Dest);assert(NULL != _Source);if (NULL ==_Dest || NULL == _Source)return NULL;char* ret = _Dest;/**_Dest和_Source的内存地址有三种排列组合:1. _Dest和_Source没有发生重叠;2. _Dest和_Source地址重叠,且_Dest的地址大于_Source的地址;3. _Dest和_Source地址重叠,_Dest的地址小于_Source的地址;第一种情况和第三种情况,直接从低位字节开始复制,即可;第二种情况,必须从高位字节开始复制,才能保证复制正确。*/if (_Dest > _Source && _Dest < _Source + count ){_Dest = _Dest + count - 1;_Source = _Source + count - 1;while(count--){*_Dest-- = *_Source--;}}else{while(count--){*_Dest++ = *_Source++;}}return ret;
}
##strcpy和memcpy的区别
strcpy和memcpy都是标准C库函数。
- strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广;
- strcpy只有两个参数,即遇到‘\0’结束复制,而memcpy是根据第三个参数来决定复制的长度。
strcpy函数实现相关推荐
- 常见面试题:重写strcpy() 函数原型
已知strcpy函数的原型是 char* strcpy(char* strDest,const char* strSrc); 1.不调用库函数,实现strcpy函数 2.解释为什么要返回char*; ...
- strcmp函数和strcpy函数
(一)strcmp函数 strcmp函数是比較两个字符串的大小,返回比較的结果.一般形式是: i=strcmp(字符串,字符串); 当中,字符串1.字符串2均可为字符串常量或变量:i 是用于存放比 ...
- 第九十六题(编写strcpy 函数)
96.08 年中兴校园招聘笔试题 1.编写strcpy 函数 已知strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc); 当中st ...
- 指针的运用与strcpy函数的优化
/*strcpy函数:将指针t指向的字符串复制到指针s指向的位置*/ 版本1: void strcpy(char *s,char *t) { int i; i = 0; ...
- C中strcpy函数实现
strcpy函数实现 strcpy函数的原型为:char* strcpy(char* _Dest, const char* _Source); //实现1 char * strcpy(char* _D ...
- strcpy函数实现的几种方式
C/C++--strcpy函数的实现 和解析 题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * s ...
- strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
strcpy函数: char *strcpy(char *Dest , const char *Src) { assert((Dest != NULL) && (Src != NULL ...
- 【C/C++ string】之strcpy函数
题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现st ...
- c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)
C++中函数的安全版本的意义及strcpy函数的功能和差别(图) 我们在进行C/C++编程时,会发现中有些函数在VS中使用时,提示使用_s的函数版本,其实这种_s的函数版本是安全版本,它们完成的任务与 ...
- strcpy函数的实现
大家一般觉得名不见经传strcpy函数实现不是非常难,流行的strcpy函数写法是: char *my_strcpy(char *dst,const char *src) {assert(dst != ...
最新文章
- Python求100以内的素数和并输出
- 去掉Word2007中的软回车(从网页粘贴文字的一些编辑)
- java8中方法区的内存大小如何设置_从Java8升级到Java11
- springboot 技术图谱_java后台(Springboot)开发知识图谱高频技术汇总-学习路线...
- python带cookie发包demo
- python 人脸检测_借助摄像头在Python中实现人脸检测
- 【设计模式】—— 解释器模式Interpret
- 给自己一个没有退路的悬崖
- 邮件营销:邮件标题如何变得更有吸引力
- ps把一张图里面的文字去掉而不改变字后面的背景;把同一个颜色的改为别的颜色
- Vue动态加载本地磁盘图片
- matlab multiply,MATLAB Matrix Multiply Code效率
- Android App性能优化之内存优化
- JS实现多线程--Concurrent.Thread.js
- python制作购物网站_django搭建简单购物网站(功能不完整)
- 使用flex时的自动换行
- 基于matlab的立体图像编码解码算法仿真与分析
- MPC车辆轨迹跟踪----理论推导
- 【提高组NOIP2017】小凯的疑惑(附证明)
- 点亮长沙夜间经济,颐而康如何成为新晋“网红打卡点”?
热门文章
- 手把手教你实现在Monaco Editor中使用VSCode主题
- 主流语言在OD下OEP特征
- 【高级数据库】第二章 第04讲 多维索引
- 【推荐谷歌地球替代软件——图新地球简介(LocaSpace Viewer)】
- 用html 做一个低调的邮箱名片
- springboot毕设项目公积金数据管理系统2p6av(java+VUE+Mybatis+Maven+Mysql)
- Couldn’t write pidfile at /run/prosody/prosody.pid; /run/prosody/prosody.pid: No such file or direct
- (阅读笔记)PARE:A Simple and Strong Baseline for Monolingual and MultilingualDistantly Supervis
- 检查文档或驱动器的访问权限
- MyCat踩坑记(Mycat搭建,使用及配置)