首页 > 代码库 > strcpy 和 memcpy自实现
strcpy 和 memcpy自实现
都是套路,详见代码注释:
#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; }
strcpy 和 memcpy自实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。