c/c++ 标准库函数实现 ------strcpy

如有错误,欢迎指正

#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));

猜你喜欢

转载自blog.csdn.net/qq_27563511/article/details/81073604