64,639
社区成员
发帖
与我相关
我的任务
分享
char * strcpy(char *dest,const char *src)
{
assert((*src!=NULL) && (*dest!=NULL));
//置成空串,可以保证代码的健壮性。
//不处理,可以保证代码的效率。
//下面这几条,语句和strcpy的功能无关,
//只是出于防御编程的目的,
//以减少非法使用,这个函数,造成的错误,保护代码的安全。
if(!dest)return NULL;
if(!src) { *dest ='\0'; return dest; }
//主体代码:
char *ret = dest;// 保存dest
//这二者,任何一个,都可以用作返回值,那么,另外一个,就用于数据复制。
while(*dest++ = *src++);
return ret;
}
1)代码有问题,'/0'不是结束符,而且返回值错误。
while((*dest++ = *src++)!='/0');//???????????????
//'/0'是啥?????,方向反了吧!!!,不知,到了何时,才能结束复制呢。
//应该是
while((*dest++ = *src++)!='\0');
//吧!
//虽然这样改,复制是成功了,
//不过
return dest;
//却是错误的,返回野指针了。
2)这段代码,没有复制结束符,返回值也不对。
/*
while(*src)
{
*dest=*src; //*src =0 时,这个语句执行不到。
dest++;
src++;
}
*/
//貌似和
//while((*dest++ = *src++)!='\0');
//以及
//while(*dest++ = *src++); //先复制,再判断,所以结束符,已经悄悄复制好了。
//相同,其实少做一件事。结束符,没有复制。
//另外,这里没有保存 dest 的首地址。
//即便复制成功 ,dest 现在指向,结束符后面了。
return dest;//返回野指针了吧。
3)修改一下,结束符复制了,返回值也没有问题,但是没有处理异常情况。
for(int i=0;i<strlen(src);i++)
{
dest[i]=src[i];//这个也不会,复制结束符。
}
//改成这样,就可以了
for(int i=0;i<=strlen(src);i++)
{
dest[i]=src[i];//会复制,结束符了。
}