C/C++ strcpy() 函数实现

已知 strcpy() 函数的原型是:
char * strcpy(char * strDest,const char * strSrc);

1. 不调用库函数,实现strcpy函数。

char* myStrcpy(cahr * dest, const char * src){if(dest == nullptr || src == nullptr || dest == src){return dest;}char * temp = dest;while(*src != '\0'){*dest++ = *src++;}*dest = *src;   // 拷贝'\0'return temp; // 返回原首地址
}

优化:

#include <assert.h>char* myStrcpy(char * dest, const char * src){assert(dest != nullptr && src != nullptr);  // assert 断言,括号内为真时跳过,否则退出程序if(dest == src) return dest;char * temp = dest;while(*dest++ = *src++){   // while((*dest++ = *src++) != '\0');}return temp;  // 返回原首地址
}

2. 解释为什么要返回char *

为了让 strcpy() 实现链式表达式,如 int length = strlen( strcpy( strDest, “hello world”) );

3. 考虑内存重叠的情况

对于strcpy而言,该函数并没有考虑内存重叠的问题,例如

char s[10] = "hello";
strcpy(s, s+1);    // 返回ello
// strcpy(s+1, s); // 应返回 hhello,但实际会报错,因为 dest 与 src 重叠了,把'\0'覆盖了

所谓内存重叠,就是 src 未处理的部分已经被 dest 给覆盖了,只有一种情况:
src <= dest <= src + strlen(src),即目标首地址在源地址段中间

C函数 memcpy 自带内存重叠检测功能,下面给出 memcpy 的实现 my_memcpy,当检测到内存重叠时,从高地址开始往地址遍历赋值,否则从低地址到高地址赋值。

#include <assert.h>
#include <cstring>
#include <iostream>
using namespace std;char* mymemcpy(char* dest, const char* src, int len){   // 内存复制,因此对于字符串,长度len应包含'\0'结束符assert(dest != nullptr && src != nullptr);if(dest == src) return dest;char* temp = dest;// 当检测到内存重叠时,从高地址开始往地址遍历赋值,否则从低地址到高地址赋值if(dest > src && dest <= src + len - 1){cout << "high to low addr" << endl;dest = dest + len - 1;              // 最高地址开始src = src + len - 1;while(len--){*dest-- = *src--;}}else{while(len--){*dest++ = *src++;}}return temp;
}char* myStrcpy(char * dest, const char * src){assert(dest != nullptr && src != nullptr); // assert 断言,括号内为真时跳过,否则退出程序if(dest == src) return dest;char * temp = dest;// while(*dest++ = *src++){    // while((*dest++ = *src++) != '\0')    // 不带重叠检测,从低到高地址复制//     ;// }mymemcpy(dest, src, strlen(src) + 1);   // 带内存重叠检测,长度为 strlen(src) + 1return temp;    // 返回原首地址
}int main(){char s1[10] = "hello";char s2[10] = "123";cout << myStrcpy(s1 + 2, s1) << endl;return 0;
}

C/C++ strcpy() 函数实现相关推荐

  1. 常见面试题:重写strcpy() 函数原型

    已知strcpy函数的原型是 char* strcpy(char* strDest,const char* strSrc); 1.不调用库函数,实现strcpy函数 2.解释为什么要返回char*; ...

  2. strcmp函数和strcpy函数

    (一)strcmp函数 strcmp函数是比較两个字符串的大小,返回比較的结果.一般形式是: i=strcmp(字符串,字符串); 当中,字符串1.字符串2均可为字符串常量或变量:i   是用于存放比 ...

  3. 第九十六题(编写strcpy 函数)

    96.08 年中兴校园招聘笔试题 1.编写strcpy 函数 已知strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc); 当中st ...

  4. 指针的运用与strcpy函数的优化

    /*strcpy函数:将指针t指向的字符串复制到指针s指向的位置*/ 版本1: void strcpy(char *s,char *t) {     int i;         i = 0;     ...

  5. C中strcpy函数实现

    strcpy函数实现 strcpy函数的原型为:char* strcpy(char* _Dest, const char* _Source); //实现1 char * strcpy(char* _D ...

  6. strcpy函数实现的几种方式

    C/C++--strcpy函数的实现 和解析 题目:      已知strcpy函数的原型是:          char * strcpy(char * strDest,const char * s ...

  7. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数

    strcpy函数: char *strcpy(char *Dest , const char *Src) { assert((Dest != NULL) && (Src != NULL ...

  8. 【C/C++ string】之strcpy函数

    题目:     已知strcpy函数的原型是:         char * strcpy(char * strDest,const char * strSrc);     1.不调用库函数,实现st ...

  9. c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)

    C++中函数的安全版本的意义及strcpy函数的功能和差别(图) 我们在进行C/C++编程时,会发现中有些函数在VS中使用时,提示使用_s的函数版本,其实这种_s的函数版本是安全版本,它们完成的任务与 ...

  10. strcpy函数的实现

    大家一般觉得名不见经传strcpy函数实现不是非常难,流行的strcpy函数写法是: char *my_strcpy(char *dst,const char *src) {assert(dst != ...

最新文章

  1. 解决数据库里表字段带下划线,实体类转小驼峰,Mapper的映射问题
  2. 2019年美国大学生数学建模竞赛(MCM/ICM) E题解题思路
  3. [雪峰磁针石博客]python网络基础工具书籍下载-持续更新
  4. 移动端日期选择插件rolldate
  5. http协议建立在以下哪一个协议的基础上_HTTP协议梳理
  6. command对象的三个主要的方法 1119
  7. 大V怒怼银行服务太差,一怒取走500万现金!上海银行回应了
  8. python yield理解_Python3 中 Yield 理解与使用
  9. CrossApp推出移动应用开发神器CrossApp Style
  10. 两个点 定位_智造讲堂:RFID定位导航技术
  11. java tif 转jpg_java 实现 tif图片(多页的)转换成jpg
  12. PhalApi 如何请求接口服务
  13. 82.【LibraryManger】
  14. mysql 5.7.21 winx64_mysql5.7.21 winx64安装配置图文分享
  15. Oracle安装之1521端口及任何端口被占用错误
  16. 罗永浩回应被叫行业冥灯:完全不能同意;联想一员工侵占公司工时费近1000万;爱彼迎CEO:办公室时代已过去 | EA周报...
  17. 超直白win7性能优化方案
  18. 微博拿下NBA,互联网巨头布局体育产业如何“绕开”版权费?
  19. 重庆邮电大学和重庆大学计算机学院,重庆拥有的这所实力派大学,具有很高的知名度,对此你了解多少...
  20. 树莓派(网络摄像头)4G网络720p高清图传(python3.7+SpringBoot-JavaNetty+Android-Mediacodec)

热门文章

  1. Spring基本配置
  2. 黑鹰s耳机可以听到自己的声音
  3. 开发过程(链式)代码处理NPE的几种方式以及优雅解决方案。
  4. 最新xcode打包上传App Store
  5. windows根据端口号查看进程(PID)信息
  6. DSSM、YoutubeDNN-推荐系统小结
  7. IDEA看源码的几个小技巧
  8. Spark在爱奇艺的应用实践
  9. 怎么查同一网络下的计算机,Windows下查看同局域网其它主机MAC地址
  10. 十一长假去旅行,不知如何规划?三个步骤,用思维导图来规划旅行路线