strcpy函数实现

原创 2018年04月15日 23:24:45

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的地址;
    3. _Dest的地址小于_Source的地址;
    第一种情况和第三种情况,直接从低位字节开始复制,即可;
    第二种情况,必须从高位字节开始复制,才能保证复制正确。
    */
    if (_Dest > _Source && _Dest < _Source + count - 1)
    {
         _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

strcpy函数实现的几种方式

C/C++——strcpy函数的实现 和解析 题目:      已知strcpy函数的原型是:          char * strcpy(char * strDest,const char ...
  • liusandian
  • liusandian
  • 2016-08-17 16:54:28
  • 1766

strcpy/strstr/strtok函数实现——菜鸟版

strcpy/strstr/strtok函数实现——菜鸟版
  • DrunkMonth
  • DrunkMonth
  • 2016-08-31 16:30:50
  • 463

如何实现字符串拷贝(不用strcpy函数)

#include #include #include void my_strcpy(char *p, char *q) { int len, i; len = strlen(p); fo...
  • hu_junhua
  • hu_junhua
  • 2018-01-21 14:34:17
  • 75

写程序实现自己的strcpy() 函数

函数 mystrcpy() 实现了strcpy() ,复制源字符串到目的串,返回一个指向目的串的指针 code #include char *mystrcpy(char *destinatio...
  • robinsongsog
  • robinsongsog
  • 2014-03-21 18:38:50
  • 1357

strcat strcpy 源代码,用指针去实现

15、 指针实现 strcmp函数     •    int newStrcpy(char *p, char *q)     •    {     •        while(*p ==*q) { ...
  • u013375242
  • u013375242
  • 2014-01-05 16:55:43
  • 1513

C/C++——strcpy函数的 几种 实现 和 详细 解析

C/C++——strcpy函数的实现 和解析 题目:      已知strcpy函数的原型是:          char * strcpy(char * strDest,const char * s...
  • wconvey
  • wconvey
  • 2014-03-13 07:39:58
  • 30204

strcpy函数详解

strcpy(s1,s2);strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy. 这样s1在内存中的存放为:ch\0; 在cout 如果说s1的长...
  • u014744118
  • u014744118
  • 2015-10-09 10:37:36
  • 2856

【C语言】模拟实现strcpy、strcat、strcmp函数

strcpy、strcat、strcmp这三个库函数是初级学习阶段经常写到的三个库函数,也是一些大公司比较喜欢出的面试题。今天,就尝试用my_strcpy、my_strcat、my_strcmp这三个...
  • Monster_Girl
  • Monster_Girl
  • 2016-07-31 19:06:08
  • 2653

C语言库函数strcpy与memcpy函数比较

C语言中strcpy与memcpy函数是怎么实现的又有哪些区别呢?   我们先来看下字符串的存储,字符串一般是用字符数组的方式存储,问题来了,我们都知道字符串有一个结束符"\0",存储字符串的字符数组...
  • changyourmind
  • changyourmind
  • 2016-07-21 14:54:51
  • 1255

【面试题】strcpy的严格实现

出现频率最高的笔试题    关键字:C++,strcpy,字符串,复制,拷贝,copy,笔试,试题    题目:    已知strcpy函数的原型是:        char * strcpy(cha...
  • jianxiong8814
  • jianxiong8814
  • 2007-06-05 23:04:00
  • 1712
收藏助手
不良信息举报
您举报文章:strcpy函数实现
举报原因:
原因补充:

(最多只允许输入30个字)