C语言——模拟实现strcpy

ops/2024/11/14 12:53:23/

首先我们先学习一下strcpy是怎么用的

#include <string.h>int main()
{char arr1[] = "hello world";char arr2[30] = { 0 };strcpy(arr2, arr1);printf("%s", arr2);return 0;
}

现在我们就要思考如何模拟实现了 

代码的初步实现非常简单哈~ 

char* my_strcpy(char* dest,const char* src)
{while (*src != '\0'){*dest = *src;src++;dest++;}*dest = *src;
}

 第一步优化:

char* my_strcpy(char* dest, const char* src)
{while (*src != '\0'){*dest++ = *src++;//后置++可以简化}*dest = *src;
}

再次优化:

char* my_strcpy(char* dest, const char* src)
{while (*dest++ = *src++)//等\0赋值过去,表达式为0,判断为假{;}
}

最后我们还能加入断言,限制传来的不能是空指针

char* my_strcpy(char* dest, const char* src)
{assert(dest != NULL);assert(src != NULL);while (*dest++ = *src++){;}
}

不过断言其实也有简化写法

char* my_strcpy(char* dest, const char* src)
{assert(dest);//如果是空指针,就是0,直接为假,就会报警assert(src);while (*dest++ = *src++){;}
}

或者再简写:

char* my_strcpy(char* dest, const char* src)
{assert(dest && src);//有一个为假就报警while (*dest++ = *src++){;}
}

最后把返回值补充一下,库函数会返回目标空间的起始地址,实际上返回的就是dest

那我们就需要提前存一份

char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* ret = dest;//提前存一份while (*dest++ = *src++){;}return ret;
}

这样模拟实现就非常精简高效的实现了


http://www.ppmy.cn/ops/112052.html

相关文章

【C++算法】位运算

位运算基础知识 1.基础运算符 << : 左移 >> : 右移 ~ : 取反 & : 按位与&#xff0c;有0就是0 I : 按位或&#xff0c;有1就是1 ^ : 按位异或&#xff0c;&#xff08;1&#xff09;相同为0&#xff0c;相异为1&#xff08;2&#xff09;无进位相加 2.…

Spring Boot-国际化(I18N)问题

Spring Boot 国际化&#xff08;I18N&#xff09;问题及其解决方案 1. 引言 随着全球化的推进&#xff0c;软件开发中的国际化&#xff08;I18N&#xff09;需求日益增长。国际化是指通过设计应用程序&#xff0c;使其能够轻松适应不同语言和地区的需求&#xff0c;而无需修改…

28. 顶点法线数据

前面给大家讲解过几何体顶点位置数据geometry.attributes.position&#xff0c;本文章给大家介绍一种新的顶点数据&#xff0c;就是顶点法线(法向量)数据geometry.attributes.normal。 测试&#xff1a;Basic材质改为Lambert材质 你可以测试下&#xff0c;把前面两节课的案例…

从index_put出发全面学习cuda和pytorch技术

一 前言 深感目前对于cuda和pytorch所涉及知识的广度和深度,但一时又不知道该如何去学习,经过多日的考虑,还是决定管中窥豹,从一个算子出发,抽丝剥茧,慢慢学习,把学习中碰到的问题都记录下来,希望可以坚持下去。 二 函数功能描述 【torch算子】torch.index_put和tor…

图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲

拓扑排序 题目链接&#xff1a;117. 软件构建 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0…

在 Vue 2 中使用 Axios 发起 POST 和 GET 请求

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 node.js&#xff0c;它提供了一种非常方便的方式来发送异步 HTTP 请求。在 Vue 2 应用中&#xff0c;Axios 可以帮助我们轻松地与后端 API 进行通信。本文将介绍如何在 Vue 2 项目中引入 Axios&#xff0c;并…

【webpack4系列】编写可维护的webpack构建配置(四)

文章目录 构建配置包设计功能模块设计和目录结构设计功能模块设计目录结构设计 使用ESLint规范构建脚本冒烟测试介绍和实际运用冒烟测试 (smoke testing)冒烟测试执行判断构建是否成功判断基本功能是否正常 单元测试和测试覆盖率测试框架编写单元测试用例单元测试接入测试覆盖率…

springboot实战章节小结

第一章小结 Spring Boot为Spring应用程序的开发提供了一种激动人心的新方式&#xff0c;框架本身带来的阻力很小。自动配置消除了传统Spring应用程序里的很多样板配置&#xff1b;Spring Boot起步依赖让你能通过库 所提供的功能而非名称与版本号来指定构建依赖&#xff1b;Spri…