都是套路,详见代码注释:
#include <stdio.h> #include <assert.h> #include <iostream> using namespace std; char* myStrcpy(char *dest, const char *sour) { assert(dest != NULL && sour != NULL);//断言dest 和 sour都不为空,如果为空将会报错 char *ret = dest;//函数实现复制功能本身可以不用返回参数,这里是为了使用链式结构,返回char*。比如:int len = strlen(myStrcpy(str1,str2)) while((*dest ++ = *sour++) != ‘\0‘); return ret; } //函数原型:定义在string.h中 也是拷贝字符串用的。size个字节拷贝到目的内存起始的地址中。小心使用也是可以用来复制各种数据类型的。 //void *memcpy(void *dst, const void *src, size_t n); //If copying takes place between objects that overlap, the behavior is undefined. //对于地址重叠的情况,该函数的行为是未定义的。 //标准库中实现了memmove函数,该函数可以实现无内存重叠,功能是把源字符串拷贝到buff中,然后在写入到目的字符串中,增加了不必要的开销。 void *myMemcpy(void *dst, const void *src, size_t size) { assert(dst && src); char *psrc;//记录src地址 char *pdst;//记录dst地址 //s------- size-----c // d-----s--------t if(src < dst && (char *)src + size > (char *)dst ){ psrc = (char*)src + size - 1; pdst = (char*)dst + size - 1; while(size --){ *pdst -- = *psrc --; } }else{ psrc = (char *)src; pdst = (char *)dst; cout<<psrc<<endl; while(size --){ *pdst ++ = *psrc ++; } } return dst; } int main() { char str [10] = "abc"; char dst[10] ; int s[10] = {1,2,3}; int d[10]; myMemcpy(dst, str, 2); dst[2] = ‘\0‘; puts(dst); myMemcpy(d, s, 3 * 4); cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl; return 0; }
时间: 2024-11-03 03:41:45