实现 strcpy 函数

来源:互联网 发布:按键精灵数组赋值 编辑:程序博客网 时间:2024/06/17 04:50

要考虑拷贝时内存重叠的情况:

#include <iostream>#include <string.h>#include <assert.h>using namespace std;char *my_strcpy(char *dst, const char *src){  assert(dst != NULL);  assert(src != NULL);  char *ret = dst;  memcpy(dst, src, strlen(src) + 1);  return ret;}int main(){  char src[] = "abcd";  char* dest = src + 1;  my_strcpy(dest, src);  cout<<dest<<endl;  return 0;}

输出:

[liboyang@database74 test]$ g++ test.cpp -std=c++11[liboyang@database74 test]$ ./a.out abcd

memcpy 函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,这里仅粘帖 memcpy 函数的实现:

void * my_memcpy(void *dst, const void *src, unsigned int count){    assert(dst);    assert(src);    void * ret = dst;    // 源地址和目的地址不重叠,低字节向高字节拷贝    if (dst <= src || (char *)dst >= ((char *)src + count))    {        while(count--)        {            *(char *)dst = *(char *)src;            dst = (char *)dst + 1;            src = (char *)src + 1;        }    }    // 源地址和目的地址重叠,高字节向低字节拷贝    else    {         dst = (char *)dst + count - 1;        src = (char *)src + count - 1;         while(count--)         {            *(char *)dst = *(char *)src;            dst = (char *)dst - 1;            src = (char *)src - 1;        }    }    return ret;}

两者结合才是 strcpy 函数的真正实现:

#include <iostream>#include <string.h>#include <assert.h>using namespace std;void * my_memcpy(void *dst, const void *src, unsigned int count){    assert(dst);    assert(src);    void * ret = dst;    // 源地址和目的地址不重叠,低字节向高字节拷贝    if (dst <= src || (char *)dst >= ((char *)src + count))    {        while(count--)        {            *(char *)dst = *(char *)src;            dst = (char *)dst + 1;            src = (char *)src + 1;        }    }    // 源地址和目的地址重叠,高字节向低字节拷贝    else    {         dst = (char *)dst + count - 1;        src = (char *)src + count - 1;         while(count--)         {            *(char *)dst = *(char *)src;            dst = (char *)dst - 1;            src = (char *)src - 1;        }    }    return ret;}char *my_strcpy(char *dst, const char *src){  assert(dst != NULL);  assert(src != NULL);  char *ret = dst;  my_memcpy(dst, src, strlen(src) + 1);  return ret;}int main(){  char src[] = "abcd";  char* dest = src + 1;  my_strcpy(dest, src);  cout<<dest<<endl;  return 0;}

输出:

[liboyang@database74 test]$ g++ test.cpp -std=c++11[liboyang@database74 test]$ ./a.out abcd
原创粉丝点击