大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是:
char *my_strcpy(char *dst,const char *src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while((* dst++ = * src++) != '\0')
;
return ret;
}
如果注意到:
1,检查指针有效性;
2,返回目的指针des;
3,源字符串的末尾 '\0' 需要拷贝。
写出上面实现函数就不在话下。
然而这样的实现没有考虑拷贝时内存重叠的情况,下面的测试用例就能使调用my_strcp函数的程序崩溃:
char str[10]="abc";
my_strcpy(str+1,str);
然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。
strcpy的正确实现应为:
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;
}
memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,它的实现方式建议查看文章“卓越的教练是如何训练高手的?”,会获益良多,这里仅粘帖函数memcpy函数的实现:
void *memcpy(void* dst,const void* src,unsigned int count)
{
assert(src!=NULL);
assert(dst!=NULL);
void *ret=dst;
char *pdst=static_cast<char*>(dst);
const char *psrc=static_cast<const char*>(src);
if (dst>src&&pdst<psrc+count) //内存重叠
{
pdst=pdst+count-1;
psrc=psrc+count-1;
while (count--)
{
*pdst=*psrc;
pdst=pdst-1;
psrc=psrc-1;
}
}
else //内存不重叠
{
while (count--)
{
*pdst=*psrc;
pdst=pdst+1;
psrc=psrc+1;
}
}
return ret;
}