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


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

    Strcpy的初步实现到完美优化

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

    我们先创建两个字符串

    int main()
    {
    	char arr1[20] = "xxxxxxxxxxxx";
    	char arr2[] = "hello world";
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    要求

    将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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    这个代码可以拿到60分

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

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

    这样子修改

    void my_strcpy(char* des, char* cpy)
    {
    	while (*cpy!='\0')
    	{
    		*des++ = *cpy++;
    		
    	}
    	*des = *cpy;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    答案还是有的

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

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

    此时while循环终止

    void my_strcpy(char* des, char* cpy)
    {
    	while (*des++ = *cpy++)
    	{
    		;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

    答案是有的

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

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

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

    assert()断言
    如果括号内部的条件是错的就会报错
    只在debug版本下有效
    再release版本中失效

    于是我们写下这段代码

    #include
    void my_strcpy(char* des, char* cpy)
    {
    	assert(cpy != NULL);
    	while (*des++ = *cpy++)
    	{
    		;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    答案是可以的

    有些时候我们可能讲目的地和需要赋值的内容搞反了 从而造成各种意想不到的错误
    因此我们可以讲需要复制的内容用const修饰
    这样子就可以避免出现上面的错误啦

    代码表示如下

    #include
    void my_strcpy(char* des,const char* cpy)
    {
    	assert(cpy != NULL);
    	while (*des++ = *cpy++)
    	{
    		;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    那么我们可以说 这段代码可以拿到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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这就是strcpy的完美实现方式

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

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

    那么大家下期再见咯

  • 相关阅读:
    MyBatisPlus(二十一)乐观锁
    kubernetes(k8s) pod(资源限制、基础概念)
    CAD与GIS集成说明(在线CAD结合GIS,webCAD)
    axios的封装
    【JS高级】ES6_模板字符串、let的简谈与应用_12
    Zip压缩包密码如何取消?没有密码该怎么办?
    前端HTML要了解的知识,DOCTYPE 声明究竟是做什么的、作用是什么?
    一站式服务:教你搭建AI知识库
    Java:Spring Boot整合mybatis-plus示例
    计算机毕业设计(附源码)python在线阅读系统
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/126831106