模拟strcpy函数,assert,const修饰指针与凉皮男孩的故事

news2024/10/7 17:28:09

         那么好了好了,宝子们,今天给大家介绍一下strcpy函数及其模拟,还有assert,const与凉皮男孩间的爱恨情仇,来吧,开始整活!⛳️(今天的内容和故事非常的有趣,希望大家一键三连,嘿嘿~) 

一、认识strcpy函数

 

废话不多说,我们直接写代码来实现一下:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include <string.h>//注意必须要引用头文件
int main()
{
	char arr1[] = "hello bit";
	char arr2[] = "xxxxxxxxxxxx";//12个
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

 

         在这个函数还需要注意一点,它也会将你的终止字符也就是字符串的结束标志\0,也会复制到目的地的数组中,接下来让我们用调试监视窗口来看一下内部是怎么个来龙去脉?

 二、模拟实现strcpy函数

版本一:

#include <stdio.h>
#include <string.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
	while (*source != '\0')
	{
		*destina = *source;
		source++;
		destina++;
	}
	*destina = *source;//不要忘了\0的copy
}

int main()
{
	char arr1[] = "hello bit";
	char arr2[] = "xxxxxxxxxxxx";//12个
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

 优化2:(+断言)

#include <stdio.h>
#include <assert.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
	//assert(断言)
	assert(destina != NULL);
	assert(source != NULL);

	while (*source!='\0')//这个地方将\0也复制了进去
	{
		source++;
		destina++;
	}
	*destina = *source;
}
int main()
{
	char arr1[] = "hello bit";
	char arr2[] = "xxxxxxxxxxxx";//12个
	char* p = arr2;//创建一个指针变量
	p = NULL;//这里要将NULL空地址赋给一个指针变量
	my_strcpy(p, arr1);
	printf("%s\n", arr2);
	return 0;
}

 

 

        assert很高效,当我们期望某一个事情不发生的时候,我们在这里断言一下,如果报错了,他能够准确的告诉你是哪一行再不用,让你再一个一个的去找哪里出了问题

        assert其实是一种预判,而且在使用的时候要引用头文件

优化3:

#include <stdio.h>
#include <assert.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
	//assert(断言)
	assert(destina != NULL);
	assert(source != NULL);

	while (*destina = *source)//这个地方将\0也复制了进去
	{
		source++;
		destina++;
	}
}
int main()
{
	char arr1[] = "hello bit";
	char arr2[] = "xxxxxxxxxxxx";//12个
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

 优化4:

#include <stdio.h>
#include <assert.h>
void my_strcpy(char* destina, char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
	//assert(断言)
	assert(destina != NULL);
	assert(source != NULL);

	while (*destina++ = *source++)//这个地方将\0也复制了进去
	{
		;//空语句:因为必须要写,但有什么也不执行
	}
}
int main()
{
	char arr1[] = "hello bit";
	char arr2[] = "xxxxxxxxxxxx";//12个
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

 优化5:(剖析strcpy库函数)(const)

 

 

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* destina, const char* source)//我们的目的是将arr1中的数组内容复制到arr1中.(目的地:destination 源头:source)
{
	//assert(断言)
	assert(destina != NULL);
	assert(source != NULL);

	char* ret = destina;//用来标记最终所复制后的数组的起始位置,以便于后续打印
	while (*destina++ = *source++)//这个地方将\0也复制了进去
	{
		;//空语句:因为必须要写,但有什么也不执行
	}
	return ret;
}
int main()
{
	char arr1[] = "hello bit";
	char arr2[] = "xxxxxxxxxxxx";//12个
	//my_strcpy(arr2, arr1);
	printf("%s\n", my_strcpy(arr2, arr1));
	return 0;
}

 

 

之前我们学过const修饰的变量,就会具有了常量的属性:

在这里我们有如下结论:

结论:
const 修饰指针变量的时候:
1. const 如果放在 * 的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改
变。但是指针变量本身的内容可变。
2. const 如果放在 * 的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指
针指向的内容,可以通过指针改变

 

 

此时此刻,我们假设现在暂时没有const

 以上是凉皮男孩的故事,有人看故事,有人照镜子。

这个故事,只是为了娱乐,是为了帮助大家更好的理解const的修饰指针时候的所起的作用效果

帮助大家理解,实际上记住结论就可以。

好了,今天的分享就到这里了

如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马学生入职B站1年,晒出21K月薪:我想跳槽华为

现在的Z时代&#xff0c;嘴上说着不要&#xff0c;身体却很诚实。 前两天&#xff0c;黑马发布了《2022年度互联网平均薪资出炉&#xff01;高到离谱&#xff01;》&#xff0c;信息传输、软件和信息技术服务业薪资遥遥领先&#xff01;Z时代举头望着天花板&#xff0c;故作潇…

jsvmp逆向实战x-s、x-t算法还原

jsvmp逆向实战x-s、x-t算法还原 什么是jsvmp定位关键点log插桩日志分析代码还原 什么是jsvmp jsvmp就是将js源代码首先编译为自定义的字节码&#xff0c;只有对应的解释器才能执行这种字节码&#xff0c;这是一种前端代码虚拟化保护技术。 整体架构流程是服务器端通过对JavaS…

Sui基金会联合Tencent Cloud和Numen在香港举办的生态交流会圆满结束

5月24日&#xff0c;由Sui基金会、Tencent Cloud和Numen Cyber联合举办的Sui生态交流会在香港圆满结束。感谢Tencent Cloud为本次活动提供了场地支持。本次活动共吸引了60余名行业同仁线上和线下的参与。 本次活动旨在提升Web3产业对Sui生态的认识&#xff0c;并为生态中的开发…

调用华为API实现图像搜索

调用华为API实现图像搜索 1、作者介绍2、华为API介绍2.1 华为云图像搜索2.2 图像搜索应用场景2.2.1商品图片搜索2.2.2版权图片搜索 2.3 调用华为API实现图像标签 3、实验过程3.1完整代码3.2运行结果3.3常见错误 1、作者介绍 张勇进&#xff0c;男&#xff0c;西安工程大学电子…

通过Python的pdfplumber库将pdf转为图片

文章目录 前言一、pdfplumber库是什么&#xff1f;二、安装pdfplumber库三、查看pdfplumber库版本四、pdf素材五、将pdf转为图片1.引入库2.定义pdf路径3.打开PDF文件4.遍历每一页5.将PDF页面转换为Image对象6.将Image对象保存为图片文件7.效果 总结 前言 大家好&#xff0c;我是…

ChatGLM-6B之SSE通信(Server-sent Events)

写这篇博客还是很激动开心的&#xff0c;因为是我经过两周的时间&#xff0c;查阅各个地方的资料&#xff0c;经过不断的代码修改&#xff0c;不断的上传到有显卡的服务器运行才得出的可行的接口调用解决方案&#xff0c;在这里记录并分享一下。 研究历程&#xff08;只是感受&…

更适合iPhone的手柄,按键手感真不赖,LEADJOY M1B上手

很多朋友平时玩手游的时候&#xff0c;操作体验往往不是很好&#xff0c;特别是到了夏天&#xff0c;手机玩久了总是热气腾腾的&#xff0c;对此&#xff0c;只需要配上一副手游手柄&#xff0c;就可以获得媲美掌机的游戏体验。最近我就在用一款LEADJOY M1B游戏手柄&#xff0c…

如何选择语音芯片?主流语音方案如何选,九芯电子来推荐

市场分析 近年来&#xff0c;随着我国半导体的不断发展和技术领域的不断突破&#xff0c;语音芯片实现了越来越多的国产化。其中涌现出的像NVD系列、NRK330X系列等不乏国产优秀产品。凭借其优秀的性能、设计&#xff0c;赢得了市场上的好评如潮。 对比分析 OTP语音芯片&#…

webAPI学习笔记3——BOM浏览器对象模型

目录 1、BOM概述 1.1 什么是 BOM 1.2 BOM 的构成 2. window 对象的常见事件 2.1 窗口加载事件 2.2 调整窗口大小事件 3. 定时器 3.1 两种定时器 3.2 setTimeout() 定时器 案例&#xff1a; 5秒后自动关闭的广告 3.3 停止 setTimeout() 定时器 3.4 setInterval() 定时…

解决不联网环境pip安装librosa、numba、llvmlite报错和版本兼容问题

项目场景&#xff1a; 项目是需要在内网不联网环境部署GitHub上一个有关音频、视频处理的深度学习Python工程&#xff0c;因此许多包需要下载好wheel包或tar包后在内网环境安装。 这个过程遇到了许多兼容性问题引起的报错。Python版本与librosa、numba、llvmlite版本兼容问题…

小狗避障-第14届蓝桥杯省赛Scratch中级组真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第139讲。 小狗避障&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组编程第4题&#xf…

从代码审计的角度分析 Ruoyi v4.7.6 的任意文件下载漏洞

前言 Ruoyi 的 v4.7.6 是 2022 年 12 月 16 日发布的一个版本&#xff0c;而任意文件下载漏洞实际上 12 月底的时候就已经爆出了&#xff0c;也陆续有一些文章在写这个漏洞&#xff0c;但是 Ruoyi 一直没有更新修复。 上月中旬&#xff08;2023 年 5 月&#xff09;&#xff0c…

内网渗透(八十四)之ADCS配置启用基于SSL的LDAP(LDAPS)

ADCS配置启用基于SSL的LDAP(LDAPS) 打开AD CS,选择证书颁发机构 选择证书模板,右键管理 选择Kerberos身份验证,右键 复制模板 然后会有一个Kerberos身份验证的副本,右键更改名称,更改为LDAPS 选择LDAPS,右键属性 设置模板属性,请求处理——>允许导出私钥(O) 创建证书…

最快实现一个自己的扫地机

​ 作者&#xff1a;良知犹存 转载授权以及围观&#xff1a;欢迎关注微信公众号&#xff1a;羽林君 或者添加作者个人微信&#xff1a;become_me 扫地机介绍 扫地机器人行业本质是技术驱动型行业&#xff0c;产品围绕导航系统的升级成为行业发展的主旋律。按功能划分&a…

【武汉万象奥科】瑞芯微RK3568芯片

▎产品展示 RK3568核心板是基于Rockchip的RK3568设计的一款高性能核心板。该处理器集成了最新的高性能CPU、GPU&#xff0c;并拥有丰富的接口&#xff0c;非常适用于工业自动化控制、人机界面、中小型医疗分析器、电力等多种行业应用。 ▎RK3568产品特点 ▎高性能处理器 ○ 采用…

linuxOPS基础_vmware虚拟机安装及介绍

虚拟机概念 什么是虚拟机&#xff1f; 虚拟机&#xff0c;有些时候想模拟出一个真实的电脑环境&#xff0c;碍于使用真机安装代价太大&#xff0c;因此而诞生的一款可以模拟操作系统运行的软件。 虚拟机目前有2 个比较有名的产品&#xff1a;vmware 出品的vmware workstatio…

pix2pixHD---model---辨别器

搭建完生成器后搭建辨别器。 首先看辨别器的输入&#xff1a;分别是标签和生成器输出。 在训练时候&#xff0c;辨别器通道输入等于生成器的输出加上conditional即标签和实例的拼接。通道相加就是图片concat。 如果使用实例图片&#xff0c;那么辨别器输入通道数加1&#xff…

《Spring Guides系列学习》guide21 - guide25

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

这款高性价比商用笔记本值得入手

随话说&#xff1a;工欲善其事&#xff0c;必先利其器。 对于打工人的我来说&#xff0c;办公一定要有一款适合的笔记本&#xff0c;否则真的是事倍功半。近日入手了戴尔Latitude 3330这款笔记本&#xff0c;通过使用体验&#xff0c;感觉真是一款高性价比的笔记本了。 接下来…

分布式事务解决方案Seata 整合 Spring Cloud + Nacos

1. 简介 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 2. Docker 安装 Seata 2.1 下载镜像 docker pull seataio/se…