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