strcpy库函数初步实现到完美优化

简介: strcpy库函数初步实现到完美优化

Strcpy的初步实现到完美优化


拷贝一个字符串到另一个字符串里面


我们先创建两个字符串


int main()
{
  char arr1[20] = "xxxxxxxxxxxx";
  char arr2[] = "hello world";
  return 0;
}


要求


将arr2的数据全部传输到arr1里面


我们分析一下


可以使用两个指针分别指向arr1 和 arr2


每次讲arr2的值赋值给arr1之后两个指针向前走一下


终止的条件是遇到‘\0’


在遇到‘\0’停止之后再下面可以再赋值一次


代码如下


这个代码可以


void my_strcpy(char* des, char* cpy)
{
  while (*cpy!='\0')
  {
    *des = *cpy;
    des++;
    cpy++;
  }
  *des = *cpy;
}
int main()
{
  char arr1[20] = "xxxxxxxxxxxx";
  char arr2[] = "hello world";
  my_strcpy(arr1, arr2);
  printf("%s", arr1);
  return 0;
}


这个代码可以拿到60分


那我们可以怎么开始进行优化呢?


我们说后置++可以配合解引用一起使用


这样子修改


void my_strcpy(char* des, char* cpy)
{
  while (*cpy!='\0')
  {
    *des++ = *cpy++;
  }
  *des = *cpy;
}


经过这么修改之后这个代码可以拿到70分


那还有没有可以优化的地方呢?


答案还是有的


我们可以把它的赋值放到while循环里去


因为当*cpy为‘0’的时候实际上它的ascll码值也是0


此时while循环终止


void my_strcpy(char* des, char* cpy)
{
  while (*des++ = *cpy++)
  {
    ;
  }
}


经过这样子的修改之后 这个函数可以拿到80分


那么还有没有可以优化的地方呢?


答案是有的


有时候如果我们输入cpy是一个空指针的时候 程序就会崩溃


这时候我们就需要一段代码来判断cpy是不是一个空指针


那就要介绍一下我们的assret()断言函数了


assert()断言

如果括号内部的条件是错的就会报错

只在debug版本下有效

再release版本中失效


于是我们写下这段代码


#include<assert.h>
void my_strcpy(char* des, char* cpy)
{
  assert(cpy != NULL);
  while (*des++ = *cpy++)
  {
    ;
  }
}


经过这样子的修改 这段代码可以拿到90分!


那么还可不可以做更进一步的优化呢?


答案是可以的


有些时候我们可能讲目的地和需要赋值的内容搞反了 从而造成各种意想不到的错误

因此我们可以讲需要复制的内容用const修饰

这样子就可以避免出现上面的错误啦


代码表示如下


#include<assert.h>
void my_strcpy(char* des,const char* cpy)
{
  assert(cpy != NULL);
  while (*des++ = *cpy++)
  {
    ;
  }
}


那么我们可以说 这段代码可以拿到99分


最后一点小细节呢就是我们的库函数是有返回值的 最后设定一个返回值就编程一个完美的strcpy函数啦


char* my_strcpy(char* des, const char* cpy)
{
  assert(cpy != NULL);
  while (*des++ = *cpy++)
  {
    ;
  }
  return (des);
}
int main()
{
  char arr1[20] = "xxxxxxxxxxxx";
  char arr2[] = "hello world";
  my_strcpy(arr1, arr2);
  printf("%s", arr1);
  return 0;
}


这就是strcpy的完美实现方式


以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够


不吝赐教 在评论区或者私信指正 博主一定及时修正


那么大家下期再见咯

相关文章
|
8月前
|
安全 程序员 C语言
探索C语言库函数:字符串拷贝函数strcpy
探索C语言库函数:字符串拷贝函数strcpy
101 0
|
C语言
你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)
你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)
66 0
|
C语言
模拟库函数strcpy
关于库函数strcpy()的详细内容,跳转文章:《C语言:字符串拷贝函数strcpy()》
43 0
|
C语言
【C语言】memcpy函数和memmove函数使用和模拟实现
【C语言】memcpy函数和memmove函数使用和模拟实现
103 0
|
8月前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
83 0
模拟实现库函数strlen
模拟实现库函数strlen
34 0
|
C语言
【C语言进阶】-- 重点字符串函数内存函数及其模拟实现(strlen,strcmp,strcat...memcpy,memmove)
【C语言进阶】-- 重点字符串函数内存函数及其模拟实现(strlen,strcmp,strcat...memcpy,memmove)
|
C语言 C++
【C语言】模拟实现库函数:strcpy
【C语言】模拟实现库函数:strcpy
78 0
|
存储 程序员
库函数(strcpy+memset函数精讲)
库函数(strcpy+memset函数精讲)
|
编译器 C语言
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
151 0