小小拷贝-strcpy洒洒水啦

今日目标

  • strcpy的学习
  • 模拟实现strcpy函数

        优化我们的代码

  • assert断言
  • const的加深认识

当然了这期博客也更新了一点文章排版和内容,大家一定要观看下去呐


上代码

调用strcpy库函数要先引头文件

strcpy(arr2,arr1) 注意点:1.括号里面的是要放地址的,或者是指针

2.逗号两边也有区别,左边如果比作是员工,那右边就是发工资的老板了,我就 是这么记忆的,感觉还不错!


第二个学习任务,模拟实现strcpy

情况有变啊,

兄弟们。

打印出来的和预期不一样啊!为什么arr2后面的几个xxx也打印出来啊??我是不想打印出来的啊。

好问题!那让我们来一探究竟。那我们这里需要运用到调式的功底了。

我们下面一步一步来:

为什么还是会打印后面的xxx呢?那问题应该出现在这前面,大概就是应该没有遇到'\0'不然遇到为什么还要打印后面的xxx呢,对吧。

继续分析

f10、f11调试

没问题,数组名就是首元素地址

第一次赋值也没错

其实到最后的赋值都没有错,这里我就跳过;

到最后一步arr1里面的东西赋值完了,准备到'\0'赋值了

如果是这里出错,没有赋值到位,那打印的时候就看不见'\0',也就出现刚刚那个xxx都打印出来了;

我们来看是不是我们想的那样,没有赋值成功,

果然,我们看,当我str++指着\0这个位置,*str='\0'的时候,我继续按f10走,程序来到while循环进行判断,但是判断条件为假,跳出循环,没有执行赋值的步骤,就来到了当前图片这个位置。

那答案不就出来了么?很简单我没有成功把\0赋值出去,导致在打印的时候打印如此情况

很粗心

哈哈哈解决了

问题找到了根源就很简单解决了,就是跳出来while循环,没有赋值。那我再跳出循环的后面继续赋值不就完事了吗,而且当前scr指到的对象就是\0,解引用后直接赋值就完事了。


写完了,那我们能不能对它优化呢

理解一下画出来的,后置++,先用再+。

那我放在后面,它解它的解引用,解完之后再++;没毛病


函数 assert() 断言

能不能继续优化了(下面这段代码让我想我也是想不出来的,但是看到这个代码,你肯定可以看懂)

 就赋值就完事儿了,while只要非零就会继续循环,当我\0赋给dest的时候,\0的ASCII码值就是0,这时候自然跳出循环。

你感觉这句就完了吗,那肯定不可能的哈哈哈哈。

我们应该要明白这里都是运用到了指针,指针如果你有一个明确的地址的话,解引用时没什么毛病的,但是如果你不知道传过来的指针是明确的或者说是一个空指针,解引用一个空指针就会出现问题了。

虽然说,在编译的时候不会报错。

 但是你在执行代码的时候就会出现以下的这种情况:

所以要避免这种情况,我们这里有引进了一个函数 assert() 断言

如果你断言的是真的,则继续执行

就在在你断言时,如果是假的,则会提示你,会告诉你错在哪,这是对程序员最大的帮助了,想想当你写了很多行代码,出现错误,想要排查,都会很难找。

 

很清晰,会告诉你具体出错在哪一行;我不希望它发生,但是发生了会把出错位置报给我。

断言不只是只能用在指针,比如说,你不想a!=5,当等于5了会报错,所以说只要一个条件不满足了就会报错,提示你在哪错了。


const的运用

你要知道我们写的strcpy和库函数里面的不一样,我们来看看库函数里面怎么定义的。

 

我们自己写的

 

探究一下

我们不小先把strcpy括号里面的关系弄混

 

报错了:运行时检查失败#2 -变量'arr1'周围的堆栈已损坏,但是他还是拷贝出来了;

如果我们加上const

 

我们发现,他会在写完代码之后就会提醒我们出错了。,而且在编译的时候就根本通过不了;

其实我之前也说过,strcpy(员工,老板),这里面右边可以说是不变的量,把自己的东西赋值给了左边,左边是要发生改变的。这里用到const这个来修饰*src,让它变成了常变量,以至于如果写错了,导致想改变常变量,这就是不可能的了。也规避了自己写完之后才发觉错误,然后慢慢改。


本期代码:

//***********************************//
//***********库函数strcpy的使用*******//
//*************模拟实现strcpy*********//

#include <stdio.h>
#include <string.h>
#include <assert.h>
//调用库函数
//int main()
//{
//	char arr1[] = "Hello bit";
//	char arr2[] = "xxxxxxxxxxxxxx";
//	strcpy(arr2,arr1);//目标起始地址(被修改者),源头起始地址(修改者)   (员工,老板)
//	printf("arr2=%s ", arr2);
//
//	return 0;
//}

//模拟实现
void my_strcpy(char* dest,const char* src)
{
	//while (*src!='\0')
	//{
	//	*dest = *src;
	//	dest++;
	//	src++;
	//}
	//优化
	assert(src != NULL);
	while (*dest++ =  * src++)
	{
		
		;
	}
	*dest = *src;
}

int main()
{
	char arr1[] = "Hello bit";
	char arr2[] = "xxxxxxxxxxxxxx";
	my_strcpy(arr2,arr1);
	printf("%s\n",arr2);
	return 0;

}

好啦,本期文章匆匆结束了,相信你也没有看够。当然在const这里面也很有讲头,也很有趣。期待下期博客哦!!!


最后的最后,创作不易!看完觉得作者写的博客对你有一定帮助,一定要记得一键三连哦
如果有错的地方也希望大佬指正出来,欢迎大家来评论交流!与大家一起学习进步!

点赞评论的我也一定会回访!!!

                                会回访!!!

                                会回访!!!重要的事情说三遍!
下期再见~
————————————————

  • 24
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值