彻底掌握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、源字符串必须以 &lsquo;/0&rsquo; 结束。

3、拷贝会将源字符串中的 &lsquo;\0&rsquo; 拷贝进去。

4、目标空间必须足够大,且必须可变。

图解分析:

彻底掌握C语言strcpy函数的用法

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 结尾必须含有 &lsquo;\0&rsquo; ,这样循环里的判断条件才能成立。

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

标签:C语言,strcpy,函数
0
投稿

猜你喜欢

  • Android自定义View之渐变色折线图的实现

    2023-09-23 21:43:03
  • C#中IEnumerable、ICollection、IList、List之间的区别

    2022-07-27 18:15:07
  • Android实现简单的文件下载与上传

    2022-02-25 00:00:14
  • Android集成微信支付功能

    2023-07-14 10:38:11
  • javaweb购物车案列学习开发

    2021-10-28 13:30:26
  • MyBatis-Plus联表查询以及分页代码实例

    2023-11-26 01:51:32
  • 使用监听器对Spring bean id进行唯一校验过程解析

    2022-04-12 18:07:21
  • C#实现文件分割和合并的示例详解

    2023-05-24 21:04:03
  • C#实现控制Windows系统关机、重启和注销的方法

    2023-07-24 17:15:05
  • Eclipse+ADT+Android SDK搭建安卓开发环境的实现步骤

    2021-12-20 19:59:32
  • Android 屏幕截屏方法汇总

    2022-01-23 05:48:18
  • RocketMQ4.5.X 实现修改生产者消费者日志保存路径

    2021-05-24 23:58:37
  • Java微信公众平台开发(14) 微信web开发者工具使用

    2023-01-30 19:21:34
  • C#将制定目录文件名转换成大写的方法

    2022-10-03 19:46:36
  • Flutter持久化存储之数据库存储(sqflite)详解

    2022-11-16 04:34:30
  • mybatis中的缓存问题解析

    2023-07-27 20:01:59
  • java之使用多线程代替for循环(解决主线程提前结束问题)

    2021-11-21 01:23:55
  • 如何优雅的进行Spring整合MongoDB详解

    2022-10-23 05:24:19
  • JavaWeb利用struts实现文件下载时改变文件名称

    2023-10-24 11:26:53
  • SpringBoot整合TomCat实现本地图片服务器代码解析

    2021-07-30 16:34:19
  • asp之家 软件编程 m.aspxhome.com