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;
}

解析:

  1. 为什么要返回char*类型;
    为了实现链式连接。返回内容为指向目标内存的地址指针,这样可以在需要字符指针的函数中使用strcpy,例如strlen(strcpy(str1, str2))。
  2. 源地址和目标地址出现内存重叠时,如何保证复制的正确性;
    调用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库函数。

  1. strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广;
  2. strcpy只有两个参数,即遇到‘\0’结束复制,而memcpy是根据第三个参数来决定复制的长度。

原文链接:https://blog.csdn.net/hhhuang1991/article/details/79955057

C中strcpy函数实现相关推荐

  1. vs2015c语言函数,c++中strcpy函数在VS2015无法使用的问题

    本篇文章介绍了c++中strcpy函数在VS2015无法使用的问题. 一:原因:一般认为是vs准备弃用strcpy的,安全性较低,所以微软提供了strcpy_s来代替 然而,strcpy_s并没有st ...

  2. 编程实现strcpy函数_C编程中的strcpy()

    编程实现strcpy函数 We earlier learned about strings in C programming in our Strings in C tutorial. Today, ...

  3. C语言 memcpy 和 strcpy 函数区别 - C语言零基础入门教程

    目录 一.memcpy 函数/strcpy 函数简介 二.memcpy 函数/strcpy 函数实战 1.strcpy 函数属于字符串拷贝 2.memcpy 函数属于内存拷贝 三.猜你喜欢 零基础 C ...

  4. 深度解析源码strcpy函数

    深度解析源码strcpy函数@TOC 前言 提示:这里可以添加本文要记录的大概内容: 本文将介绍c语言中string.h中strcpy函数的源码解析 提示:以下是本篇文章正文内容,下面案例可供参考 一 ...

  5. strcpy函数实现

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

  6. C语言 strcpy 函数 - C语言零基础入门教程

    目录 一.strcpy 函数简介 二.strcpy 函数实战 1.strcpy 函数简单使用 2.strcpy 函数拷贝内容以'\0'结尾 3.strcpy 函数注意崩溃问题 三.猜你喜欢 零基础 C ...

  7. C语言strcpy函数的使用

    点击蓝字 关注我们 strcpy简单使用:  #include <stdio.h> #include <string.h>struct Student {int sid;cha ...

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

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

  9. 不使用strcpy函数,编程实现把b字符串复制到a中的程序(字符串长度限制在100个字符以内)。以下是部分代码,请完成并提交

    不使用strcpy函数,编程实现把b字符串复制到a中的程序(字符串长度限制在100个字符以内).以下是部分代码,请完成并提交. #include <stdio.h> int main(){ ...

最新文章

  1. System Center 2012 Process Automatic
  2. printf 指针地址_数组指针和指针数组
  3. Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)
  4. 《几何与代数导引》习题1.18——Ceva 定理
  5. 一个简单的WPF字体选择器实现
  6. python tqdm自定义更新进度条
  7. A-Webkit第四章:添加学生
  8. 模块调用时对参数值的更改
  9. new Date()浏览器兼容性问题
  10. Neotec WELLFLO V8.1.6 油气井生产 模拟软件
  11. C语言运算符的优先级与结合性
  12. 基础平面设计(文字排版篇)
  13. 美国范德堡大学计算机科学博士,范德堡大学计算机科学专业是什么?相关信息是哪些呢?...
  14. html5canvas圆角矩形,html5 canvas 绘制圆角矩形
  15. ansible批量修改主机密码(非明文)
  16. FLEAPHP框架的文件缓存系统
  17. 红帽系统服务器格式化,Redhat Linux默认的文件系统是什么格式?
  18. 对标西湖大学,年薪60万博士后招聘来了
  19. 线上调试神器arthas
  20. 华为呼叫中心解决方案学习笔记三(多呼叫中心组网POOL)

热门文章

  1. 0基础学python难吗-零基础入门学习Python技术难不难?
  2. python2好还是python3好-Python 2 和 Python 3 有哪些主要区别?
  3. python散点图拟合曲线-使用python通过点拟合曲线
  4. 在哪里能收到python实例代码-python下10个简单实例代码
  5. python3下载手机安卓版-QPython3下载
  6. python常用标准库有哪些-Python 200个标准库汇总
  7. DL-3利用MNIST搭建神经网络模型(三种方法):1.用CNN 2.用CNN+RNN 3.用自编码网络autoencoder
  8. codeforces D. Palindrome Degree(hash)
  9. UVa483 Word Scramble
  10. java I/O思维导图