C语言-字符串函数的实现(二)之strcpy
C语言中的字符串函数有如下这些
- 获取字符串长度
- strlen
- 长度不受限制的字符串函数
- strcpy
- strcat
- strcmp
- 长度受限制的字符串函数
- strncpy
- strncat
- strncmp
- 字符串查找
- strstr
- strtok
- 错误信息报告
- strerror
接下来看看如何实现它们
长度不受限制的字符串函数
strcpy
我们看看文档是怎样说的,如下
char * strcpy ( char * destination, const char * source );
Copy string
字符串拷贝(字符串复制)
Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
复制由字符指针source指向的C字符串到另一个字符数组中,该字符数组由字符指针destination指向
To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.
为避免溢出,由destination指向的字符数组的大小需要足够长,足够包含住源字符串(包含'\0')
综上,可以知道
- 会将源字符串中的 '\0' 拷贝到目标空间,源字符串必须以 '\0' 结束。
- 目标空间必须足够大,以确保能存放源字符串。
怎么实现拷贝?
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "bit";
// 把arr2的内容拷贝到arr1中
//strcpy(arr1, arr2);
// 怎么拷贝?
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
实现
断言指针不为空是个好习惯~
//char* my_strcpy(char* dest, char* src)
// src加上const,为什么?因为我们只需要拷贝,不需要改动源字符串,防止发生修改,所以加上const修饰
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src; // '\0'
// 返回目的空间的起始地址
return dest;
}
源字符串拷贝到目的空间,寻找'\0',不是'\0'的就执行*dest = *src,把源字符赋值给目的空间,然后两个指针都往后偏移,也就是都进行++,当*src为'\0'时,说明源字符串已经到结尾了,就退出这个循环,直接将'\0'赋值给*dest,最后返回dest
可以进行优化,如下
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
// 优化
while (*src != '\0')
{
*dest++ = *src++;
}
*dest = *src; // '\0'
// 返回目的空间的起始地址
return dest;
}
当然还可以继续优化,变得更加简洁,直接将*dest++ = *src++作为判断条件,同时还会执行操作,如下
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
// 优化
// 拷贝src指向的字符串到dest指向的空间,包含'\0'
char* rest = dest;
while (*dest++ = *src++)
{
;
}
// 返回目的空间的起始地址
return rest;
}
C语言-字符串函数的实现(二)之strcpy的更多相关文章
- 13-C语言字符串函数库
目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...
- C语言字符串函数大全
C语言字符串函数大全 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include ...
- 07 --C语言字符串函数
1)字符串操作 复制 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strdup(char *str) 将串拷贝到新建的位置处 ...
- C语言-字符串函数的实现(一)之strlen
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...
- C语言-字符串函数的实现(五)之strstr
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...
- C语言字符串函数例子程序大全 – string相关
关于字符串函数的应用细则,例子程序 – jerny 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source) ...
- 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
- c语言字符串函数详解
转载请注明来源:https://www.cnblogs.com/hookjc/ oid *memset(void *dest, int c, size_t count); 将dest前面count个字 ...
- 关于C语言字符串函数使用的一点心得
就字符串的拼接函数为例strcat. 原型:extern char *strcat(char *dest,char *src);用法:#include <string.h> 功能:把src ...
随机推荐
- Javascript中的事件冒泡与捕获
事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数,useCapture:是否使用事件捕获,觉得有点模糊 Js事件流 页面的哪一部 ...
- 敏捷史话(七):从程序员、作家到摇滚乐手——Andy Hunt的多面人生
与其说 Andy Hunt 是敏捷宣言的创始人,不如说他是一名专业作家来得更为合适.他的<实用程序员><程序员修炼之道:从小工到专家><编程 Ruby:实用程序员指南&g ...
- 二分图最小点覆盖构造方案+König定理证明
前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 \(Dinic\) 算法进行实现,时间复杂度为 \(O(n\sqrt{e})\),其中, \(n\)为二分图中左部点的数量, ...
- Python函数注解
目录 函数注解概述 实际应用 inspect模块 业务代码 总结 以下内容基于Python 3x 涉及的知识前提: 建议理解Python装饰器后学习此内容 函数注解概述 函数注解可以针对函数的参数.返 ...
- 微信支付 V3 的 Java 实现 Payment Spring Boot-1.0.7.RELEASE 发布
Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 功能特性 实现微信支 ...
- 01.从0实现一个JVM语言之架构总览
00.一个JVM语言的诞生过程 文章集合以及项目展望 源码github地址 这一篇将是架构总览, 将自顶向下地叙述自制编译器的要素; 文章目录 01.从0实现一个JVM语言之架构总览 架构总览目前完成 ...
- HDOJ-3065(AC自动机+每个模板串的出现次数)
病毒侵袭持续中 HDOJ-3065 第一个需要注意的是树节点的个数也就是tree的第一维需要的空间是多少:模板串的个数*最长模板串的长度 一开始我的答案总时WA,原因是我的方法一开始不是这样做的,我是 ...
- OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...
- Java 集合框架 03
集合框架·HashSet 和 TreeSet HashSet存储字符串并遍历 * A:Set集合概述及特点 * 通过API查看即可 * 无索引,不可以重复,无序 * B:案例演示 * HashSet存 ...
- Windows-Redis占用C盘系统空间
发现redis在电脑死机蓝屏的情况下,就是非正常退出redis会导致redis的缓存文件不会回收,占用系统空间, 下次在启动的时候,会再次创建一个10G多的缓存文件,极度占用磁盘空间. 现说明解决办法 ...