• 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的完美实现方式

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

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

    那么大家下期再见咯

  • 相关阅读:
    详谈一下:Java中的基本类型变量(8种)与引用类型变量的区别
    深度拆解 OpenCoWork:一个本地多智能体桌面平台的架构设计与实现
    YOLOV7详细解读(二)论文解读
    深入理解Linux网络笔记(一):内核是如何接收网络包的
    winform车辆管理系统VS开发sqlserver数据库CS结构c#编程源码程序
    较难算法美丽塔时间复杂度O(n)
    修改el-form-item中label样式
    从一到无穷大 #2 优雅的感知与处理Elephant Flows
    Thymeleaf常见属性
    ArcGIS中ArcMap栅格图层0值设置为NoData值的简便方法
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/126831106