彻底掌握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


猜你喜欢
- 一、反射的基本概念1、反射的概念将类的各个组成部分封装成其他对象,这就是反射的机制.通过上图,我们可以通过反射获得Person类的Class
- 本文实例为大家分享了javaweb文件打包批量下载,供大家参考,具体内容如下// 批量下载未批改作业 @RequestMapping(val
- TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。TreeSet 和 Tree
- 前言 SpringCloud 是微服务中的翘楚,最佳的落地方案。 在微服务架构中多层服务之间会相互调用,如果其中有一
- 前言代码库:https://gitee.com/leo825/springboot-learning-parents.git之前写过《Spr
- 本文实例为大家分享了java实现双人五子棋游戏的具体代码,供大家参考,具体内容如下通过 上下左右 控制棋盘走动 空格落子 &nb
- 一、引言大家都知道单例模式,通过一个全局变量来避免重复创建对象而产生的消耗,若系统存在大量的相似对象时,又该如何处理?参照单例模式,可通过对
- 本文主要给大家介绍java的InputStream 流的使用。(1)FileInputstream: 子类,读取数据的通道使用步骤:1.获取
- Java中存在着两种Random函数:java.lang.Math.Random;调用这个Math.Random()函数能够返回带正号的do
- Android ListView填充数据的方法因为多人开发,为了是自己开发的模块方便融合到主框架中,同时也为了减小apk的大小,要求尽可能少
- 1. 什么是静态内部类在Java中有静态代码块、静态变量、静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌
- FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。ffmpeg命令参数如下:通用选项-L license
- 本文实例讲述了Java基于分治法实现的快速排序算法。分享给大家供大家参考,具体如下:package cn.nwsuaf.quick;/**
- 大二的时候做的课程设计,图片管理器,当时遇到图片很多的文件夹,加载顺序非常慢。虽然尝试用多个Thread加载图片,却无法保证图片按顺序加载。
- 1:创建新工程,无脑下一步输入工程名称,选择地址,完事。2:配置tomcat先从tomcat官网下载zip包( https://tomcat
- 前言apollo配置经常使用的方式是@value,比较便捷,如果只出现在一个类中还行,但是如果多个类中并不是很方便,特别是如果出现配置值变化
- XY个人记SparkSQL是spark的一个模块,主入口是SparkSession,将SQL查询与Spark程序无缝混合。DataFrame
- 常规调用方式:(这个肯定会弹出cmd窗口)Runtime.getRuntime().exec("cmd.exe &nbs
- 前言P6Spy是一个框架,它可以无缝地拦截和记录数据库活动,而无需更改现有应用程序的代码。一般我们使用的比较多的是使用p6spy打印我们最后
- 在C#中用同一个dataset保存从数据库中取出的多张表:cmd.CommandText = "select * from tab