模拟实现库函数strcpy之assert和const的用法

模拟实现库函数strcpy

要求:把字符串src(源空间)复制到分配好的字符串空间dest(目标空间)中。

1:最简单基础代码

void my_strcpy(char *dest, char *src)

{

   while(*src != '\0')

    { 

      *dest = *src;

      src++;

      dest++;

     } 

     *dest = '\0';

}

int main ()

{

   char arr [10];         //空间足够大,即大于等于7

   char *p = "abcdef";    //以 '\0' 结束

   my_strcpy(arr,p);

   printf ("%s\n",arr);

   return 0;

}

(以下代码红色部分为优化部分)

2:优化代码如下:

void my_strcpy(char *dest, char *src)

{

   while(*src != '\0')

   { 

         *dest++ = *src++;

   } 

   *dest = '\0';

}

int main ()

{

   char arr [10];         

   char *p = "abcdef";   

   my_strcpy(arr,p);

   printf ("%s\n",arr);

   return 0;

}

3:更加优化的代码如下:

void my_strcpy(char *dest, char *src)

{

  while((*dest++ == *src++) != 0)   //先解引用再++

    { 

          ;

    } 

    *dest = '\0';

}

int main ()

{

   char arr [10];        

   char *p = "abcdef";    

   my_strcpy(arr,p);

   printf ("%s\n",arr);

   return 0;

}

注:

      1:目标空间是可改的:

      2:目标空间足够大,至少和源空间等大;

      3:源空间必须有 ‘\0’ 结束,否则程序运行结果会崩溃。

eg:

char p [] = {'a','b','c','d','e','f'};    //没有 '\0' 结束,所以不能作为源空间

char *p = "a b c d e f";             // 有 '\0' 结束,可以作为源空间

4:考虑到指针变量不能为空,所以模拟实现库函数strcpy的代码还可以继续优化

如下:

 

void my_strcpy(char *dest, char *src)

{

    if(dest == NULL)

   {

    return;

   }

   if(src == NULL)

   {             

    return;

   }                    

  while((*dest++ == *src++) != 0)   //先解引用再++

    { 

          ;

    } 

    *dest = '\0';

}

int main ()

{

   char arr [10];         

   char *p = "abcdef";    

   my_strcpy(arr,p);

   printf ("%s\n",arr);

   return 0;

}

 

5:如果使用assert(断言) 代码还可以优化

void my_strcpy(char *dest, char *src)

{

   assert(src != NULL);   //断言

   assert(dest != NULL);

   while((*dest++ = *src++)!= '\0')

   { 

       ;

   

}

int main ()

{

   char arr [10];         

   char *p = "abcdef";    

   my_strcpy(arr,p);

   printf ("%s\n",arr);

   return 0;

}

 

注: assert (断言)是一个宏

6:*src 不能被改变,考虑到代码的严谨性,还可以用 const 来继续优化

void my_strcpy(char *dest, const char *src)   //不能改变*src的值

{

   assert(src != NULL);   

   assert(dest != NULL);

   while((*dest++ = *src++)!= '\0')

   { 

       ;

   } 

}

int main ()

{

   char arr [10];         

   char *p = "abcdef"; 

   my_strcpy(arr,p);

   printf ("%s\n",arr);

   return 0;

}

 

7:如果应用链式访问,代码还可以继续优化

char* my_strcpy(char *dest, const char *src)

{

   char *ret = dest;

   assert(src != NULL);   

   assert(dest != NULL);

   while((*dest++ = *src++)!= '\0')

   { 

       ;

   } 

   return ret;

 }

int main ()

{

   char arr [10];        

   const char *p = "abcdef";    

 //char *ret = my_strcpy(arr,p);

   printf ("%s\n",my_strcpy);

   return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值