1、重写strcpy函数
原型声明:extern char *strcpy(char *dest,const char *src);
功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
返回:返回指向dest的指针
实现:char * strcpy(char * strDest,const char * strSrc)
{
char* CopyDest=dest;
if(dest==null||src==null) throw "invalid argument";
while((*strDest++=*strSrc++)!='\0');
return CopyDest;
}
返回strDest的原始值使函数能够支持链式表达式,增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想。
2、重写memcpy函数
原型声明:void *memcpy(void *dest, const void *src, size_t n);
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
返回值:dest值
实现:
void *memcpy(void *dest, const void *src, size_t size) { //要拷贝的源,即const void* src,应该是用const的,避免有意或无意的修改
assert((dest!= NULL) && (src!= NULL)); // 使用断言
byte*pbTo = (byte *) dest; // 防止改变dest的地址
byte*pbFrom = (byte *) src; // 防止改变src的地址
while(size-- > 0 )
*pbTo++= *pbFrom++ ;
return pvTo;
}
最常见的写法:
void* memcpy( void* dest, const void* src, size_t count )
{
if (count<0)
{
printf("Invalid count number !.\n");
return (void*)0;
}
if(src==NULL || dest==NULL)
return (void*)0 ;
if ((unsigned int)dest==(unsigned int)src)
{
printf("The source is equal with the destanation!.\n");
return dest;
}
char* d = (char*)dest;
const char* s = (const char*)src;
while(count--) *d++ = *s++;
return dest;
}
3、strcpy和memcpy主要有以下3方面的区别。
1)、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 2)、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。 3)、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy