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

         那么好了好了,宝子们,今天给大家介绍一下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的修饰指针时候的所起的作用效果

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

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

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

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机的两路数字电压表Protues仿真设计

目录 一、设计背景 1.1、数字电压表的发展历程 1.2、课题的意义和目的 二、实现功能 三、仿真演示 四、部分程序展示 一、设计背景 1.1、数字电压表的发展历程 数字电压表简称DVM&#xff0c;它是采用数字化测量技术设计的电压表。从性能来看&#xff1a;数字电压表的发展从…

Go完整即时通讯项目及Go的生态介绍

Go完整即时通讯项目 项目架构&#xff1a; 1 编写基本服务端-Server server.go package mainimport ("fmt""net" )// 定义服务端 type Server struct {ip stringport int }// 创建一个Server func NewServer(ip string, port int) *Server {return …

Vue电商项目--分页器制作

分页器静态组件 分页这个组件&#xff0c;不单单是一个页面用到了。多个页面同时用它,因此我们可以封装成一个全局组件 需要将这个分页结构拆分到components 通用的分页组件Pagination <template><div class"pagination"><button>1</butto…

公司只有1个测试,领导却让我测试10个项目,这不是为难我....

读者提问&#xff1a;公司只有 1个测试&#xff0c;领导让我同时测试 10个项目&#xff0c;我该怎么办&#xff1f;回答&#xff1a;如果我是那个测试&#xff0c;我会做这三件事 1、向上申请资源2、任务分配到人3、执行测试任务 一、向上申请资源 1个测试同时对接 10个项目&a…

python 自动化学习(三) 句柄获取、模拟按键、opencv安装

一、什么是句柄 句柄是在操作系统中的一种标识符&#xff0c;相当于我们每个人的身份证一样&#xff0c;句柄在电脑中也是有唯一性的&#xff0c;我们启动的每一个程序都有自己的句柄号&#xff0c;表示自己的身份 为什么要说句柄&#xff0c;我们如果想做自动化操作时&#xf…

分布式项目 11 在项目中使用jsonp发送请求并且处理

在项目中使用jsonp技术 01.相关子系统的搭建 第一步&#xff1a;创建一个新的子系统&#xff0c;叫做jt-sso 选中jt父级项目&#xff0c;然后鼠标右键进行new&#xff0c;然后选中maven Model&#xff0c;进行项目的创建&#xff0c;具体操 作如下图所示&#xff1a; 第二步…

空气中的声压级、声功率级、声强级的区别

空气中的声压级、声功率级、的区别 在学习声学理论时&#xff0c;经常听到&#xff0c;声压级、声强级、声功率级的名称&#xff0c;经常也听到它们的单位为dB.但是它们是怎样的区别呢&#xff1f;下面介绍这几个名词 一、定义和计算 1.声压级 声压级以 L p {L_p} Lp​表示&am…

解决weekofyear跨年问题

目录 前言跨年问题计算当年第几周前言 前段时间,做了一个日期维度表的需求,发现 计算当年第几周 有误,发现 Hive 中 weekofyear 函数存在跨年问题! 跨年问题 这一周算上一年还是下一年,取决于这一周的大多数日期(4天及以上)在哪一年。算在前一年,就是前一年的最后一…

算法修炼之练气篇——练气十二层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

机械师曙光16电脑开机自动蓝屏怎么解决?

机械师曙光16电脑开机自动蓝屏怎么解决&#xff1f;有的用户在使用机械师曙光16电脑的时候&#xff0c;遇到了一些系统问题&#xff0c;导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏&#xff0c;无法进行任何操作。那么这个情况怎么去进行问题的解决呢&#xff1f;来…

【2023年电工杯数学建模竞赛B题人工智能对大学生学习影响的评价】完整思路分析+完整代码

1.问题背景与描述 这道题整体还是相对简单的&#xff0c;比较适合新手&#xff0c;选的人多对应获奖数量也会多&#xff0c;所以不要纠结于选题&#xff0c;就选你看上去能做的就好 2.问题分析 2.1 问题一的分析 对附件2中所给数据进行分析和数值化处理&#xff0c;并给出处…

SpringMVC一站式学习,分分钟钟让你上手

文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、接收请求参数3.1 基本类型参数3.2 实体收参【重点】3.3 数组收参3.4 集合收参 【了解】3.5 路径参数3.6 中文乱码 四…

【Netty】字节缓冲区 ByteBuf(七)(下)

文章目录 前言一、实现原理二、ByteBuf 的使用案例三、ByteBuf 的3种使用模式3.1 堆缓冲模式3.2 直接缓冲区模式3.3 复合缓冲区模式 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概…

springcloud-alibaba (03)sentinel实现规则持久化-流控规则为例

Sentinel和Nacos的整合可以实现规则动态配置&#xff0c;即在Nacos中修改规则后&#xff0c;Sentinel能够实时地读取并应用新的规则。而规则持久化则是指将规则保存在Nacos中&#xff0c;以避免意外故障或重启时规则被丢失。 实现规则持久化&#xff0c;可以按照以下步骤进行操…

达梦数据库索引的建立使用

达梦数据库支持聚集索引&#xff0c;复合索引&#xff0c;函数索引&#xff0c;唯一索引&#xff0c;位图索引等等。 一.建立索引的准则 1.1在表中插入数据后创建索引 一般情况下&#xff0c;在插入或装载了数据后&#xff0c;为表创建索引会更加有效率。如果在装载数据之前…

进阶篇丨链路追踪(Tracing)很简单:常见问题排查

作者&#xff1a;涯海 经过前面多篇内容的学习&#xff0c;想必大部分同学都已经熟练掌握分布式链路追踪的基础用法&#xff0c;比如回溯链路请求轨迹&#xff0c;定位耗时瓶颈点&#xff1b;配置核心接口黄金三指标告警&#xff0c;第一时间发现流量异常&#xff1b;大促前梳…

电赛E题声源定位跟踪系统制作全过程

声源定位 文章目录 声源定位前言一、题目二、设计步骤1.设计思路2.声源追踪定位的分析3.舵机转角的确定4.声源距离的计算 三、代码编写1.求均值2.卡尔曼滤波 复刻一下电赛的声源定位 前言 2023年的电子设计竞赛快要开始了&#xff0c;同时我也已经大三下了正在准备找工作&…

涨点神器:基于Yolov5/Yolov7的小目标性能提升

1.小目标介绍 目标检测近十年涌现了一大批如Faster R-CNN、RetinaNet、YOLO等可以在工业界实用的目标检测方法,但小目标检测性能差的问题至今也没有被完全解决。因为Swin Transformer的提出,COCO test-dev上的 AP 已经刷到64 ,但小目标检测性能(即APS )和大目标检测性能(…

分享以MM32SPIN0280单片机为主控洗衣机方案

洗衣机是利用电能产生机械作用来洗涤衣物的清洁电器&#xff0c;按驱动方法有3类&#xff0c;直接驱动&#xff0c;皮带驱动&#xff0c;波轮式驱动。 主变一体洗衣机方案以MM32SPIN0280为主控 MCU规格&#xff1a; -ArmCortex-M0内核&#xff0c;最高工作频率可达96MHz -128…

MOSN 基于延迟负载均衡算法——走得更快,期待走得更稳

文&#xff5c;纪卓志&#xff08;GitHub ID&#xff1a;jizhuozhi) 京东高级开发工程师 MOSN 项目 Committer 专注于云原生网关研发的相关工作&#xff0c;长期投入在负载均衡和流量控制领域 前言 这篇文章主要是介绍 MOSN 在 v1.5.0 中新引入的基于延迟的负载均衡算法#2…