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