IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 小小拷贝-strcpy洒洒水啦 -> 正文阅读

[C++知识库]小小拷贝-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这里面也很有讲头,也很有趣。期待下期博客哦!!!


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

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

????????????????????????????????会回访!!!

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:47:11  更:2022-01-14 01:47:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:32:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码