如有错误,欢迎指正
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//先把大家都能考虑到的实现写一下吧
char* strcpy1(char* dest,char* origin)
{
if(dest==NULL ||origin==NULL)
return NULL;
char* return_p=dest;//存储dest的头地址,返回用
while((*origin)!='\0')
{
*dest=*origin;
dest++;
origin++;//其实这里可以简写,但是方便读者阅读,就写麻烦一点了
}
*dest='\0';
return return_p;
}
上面的实现很容易理解,但是这种情况下会有问题 strcpy1(ptr1+1,ptr1); \0会被覆盖掉,结果会无尽的循环,直至内存耗尽
所以改善版本也就出来了:
char * strcpy2(char * dest,char* origin)
{
if(dest==NULL || origin==NULL)
return NULL;
//这里判断内存重叠的逻辑就是根据两个指针差和长度比较
char * dest_buf=dest;
char* ret=dest;
char * origin_buf=origin;
int size=strlen(origin);//获取了原始字符串长度
if(dest>=origin && dest-origin<=size)
{//从高位遍历就可以避免这个问题
dest_buf=dest+size;
origin_buf=origin_buf+size;//这样就包含\0了
size+=1;
while(size--)//遍历次数少一次,因为包含\0,并且0位不会遍历,
{
*dest_buf--=*origin_buf--;
}
}else
{
size=size+1;//变为总长度,包含\0
while(size--)
{
*dest++=*origin++;
}
}
return ret;
}
另外几点可以注意:
1.参数中可以加入const,防止修改内存数据
2.空指针的检查,反正程序崩溃
3.返回的是目标首地址,因为想要支持链式编程 比如int size=strlen(strcpy2(dest,origin));