彻底掌握C语言strcpy函数的用法
作者:<vince> 发布时间:2023-07-03 07:21:18
strcpy函数详解如下
1.函数介绍
1.1.函数接口
char * __cdecl strcpy(char * dst, const char * src);
这里是库函数里面的函数定义接口。该函数作用是将一组字符串复制到另一组字符串中去,就是所谓的 复制字符串函数。
1.2.函数分析
1、这里是将源字符串拷贝到目标字符串空间中去。
2、源字符串必须以 ‘/0’ 结束。
3、拷贝会将源字符串中的 ‘\0’ 拷贝进去。
4、目标空间必须足够大,且必须可变。
图解分析:
2.库函数strcpy源代码
char * __cdecl strcpy(char* dst, const char* src)
{
char * cp = dst;
while((*cp++ = *src++) != '\0')
;
return( dst )
}
2.1.库函数分析
分析:
1、 这里 dst 就是指向目标字符空间的指针,所以不能用const 修饰,必须是可变的;src 是源字符串,源字符串可以用const 修饰。
2、 这里源字符串 src 结尾必须含有 ‘\0’ ,这样循环里的判断条件才能成立。
3、这里*cp++ = *strc++这种写法更加简便,缩短代码量。
3.模拟实现strcpy函数
3.1.模拟实现
char* my_strcpy(char* str2,const char* str1)
{
char* first = str2;
assert(str2 && str1);//这里注意,尽量把assert放在char*
//first的下一行
//有的编译器中若将assert放在最前面,可能无法编译,因为C语言规定变量的常见必须放在代码前面
while (*str2++ = *str1++)
{
;
}
return first;
}
int main(void)
{
char ch1[] = "abcde";
char ch2[] = "XXXXXXXXXXXX";
printf("%s\n", my_strcpy(ch2, ch1));//这里是链式访问
//在一个函数里面去访问另一个函数的值,就是链式访问
}
分析总结:
1、尽量不要返回局部变量的地址。(因为局部变量在函数内部使用后:在出这个函数后,其局部变量的空间就会被销毁,就不会再指向这个函数之前使用的地址了,所以就无法访问到之前使用的地址,就会出现非法访问内存的错误)。
2、指针不知道赋什么值的时候,就给NULL。
3、指针使用完后,就给NULL。
写在后面
友友们,相聚的时刻总是短暂的,又到了说再见的时候啦~ 但是字符串这一块经常在面试的时候会出模拟实现某某字符串函数的面试题,因此我们不能只会平时利用头文件直接调用而不去摸清原理哈~ 要做到 摸清、拿捏、吃透 字符串函数。
以上代码均可运行,所用编译环境为 vs2019 ,运行时注意加上编译头文件#define _CRT_SECURE_NO_WARNINGS 1
来源:https://blog.csdn.net/m0_56817529/article/details/124072530


猜你喜欢
- [LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子
- SharedPreferences介绍:SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置
- 可以静态绑定数据源,这样就自动为DataGridView控件添加 相应的行。假如需要动态为DataGridView控件添加新行,方法有很多种
- 前言上一篇我们认识了Kotlin编程语言,也搭建好开发环境。本篇就进入Kotlin的基础语法介绍,与其他编程语言一样,Kotlin也有自己的
- 1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)&nb
- 一、整体设计1、需求分析池化技术是计算机中的一种设计模式,内存池是常见的池化技术之一,它能够有效的提高内存的申请和释放效率以及内存碎片等问题
- 接收到这样一个需求,就是英文名字中firstName和lastName,其中任何一个为null,就返回Empty。刚拿到需求,这不简单,if
- AlertDialog可以在当前的界面上显示一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlertD
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- Android Studio 打包 jar 及 aar 包创建工程 New -> Module -> Library在gradl
- 一、前言(吐槽+煽情+简介) &n
- 因为mybatis好使,所以几乎需要操作数据库的时候,我都会使用mybatis,而且在一个正式的项目中,同时存在BS和CS的程序,都使用的M
- 需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的I
- 构造方法以及参数:PageView可用于Widget的整屏滑动切换,如当代常用的短视频APP中的上下滑动切换的功能,也可用于横向页面的切换,
- iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下:#import <CoreLo
- 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,
- 接触过Android开发的同学们都知道在Android中访问程序资源基本都是通过资源ID来访问。这样开发起来很简单,并且可以不去考虑各种分辨
- 本文实例讲述了C#实现对Json字符串处理方法,分享给大家供大家参考。具体分析如下:一般对于web应用开发人员来说对Json字符串都会很熟悉
- 一、项目要求实现一个通讯录通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定
- [LeetCode] 159. Longest Substring with At Most Two Distinct Characters