(1)strcpy函数的代码实现
char *strcpy(char *dst,const char *src){//源字符串参数用const修饰,防止修改源字符串。
assert(dst != NULL && src != NULL);//检查指针的有效性,如果它的条件返回错误,则终止程序执行。
char *ret = dst;
while ((*dst++=*src++)!='\0');
return ret;
}
(2)为什么要返回char *?
返回dst的原始值使函数能够支持链式表达式。链式表达式的形式如:int l=strlen(strcpy(strA,strB));又如:char * strA=strcpy(new char[10],strB);
返回strSrc的原始值是错误的。
其一,源字符串肯定是已知的,返回它没有意义。
其二,不能支持形如第二例的表达式。
其三,把const char *作为char *返回,类型不符,编译报错。
(3)考虑dst和src内存重叠的情况
所谓重叠,就是src未处理的部分已经被dst给覆盖了,只有一种情况:src<=dst<=src+strlen(src)。C函数memcpy自带内存重叠检测功能,下面给出memcpy的实现my_memcpy。
char *strcpy(char *dst,const char *src){
assert(dst != NULL && src != NULL);
char *ret = dst;
my_memcpy(dst, src, strlen(src)+1);
return ret;
}
my_memcpy的实现:
char *my_memcpy(char *dst, const char* src, int cnt){
assert(dst != NULL && src != NULL);
char *ret = dst;
if(dst >= src && dst <= src+cnt-1){//内存重叠,从高地址开始复制
dst = dst+cnt-1;
src = src+cnt-1;
while (cnt--)
*dst-- = *src--;
}else{//正常情况,从低地址开始复制
while (cnt--)
*dst++ = *src++;
}
return ret;
}