今日目标

  • 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这里面也很有讲头,也很有趣。期待下期博客哦!!!

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

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

会回访!!!

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

小小拷贝-strcpy洒洒水啦相关推荐

  1. 程序员:搞Java年薪40W是什么水平?我:也就洒洒水了(滑稽)

    前言 按照一贯的尿性,脱离了剂量谈毒性都是耍流氓,年薪这种事,脱离了地域城市谈多少钱也是耍流氓.我有个同事,最近去了腾讯,职级为8级,从他那里获得的信息是,在深圳,8级可以拿到将近50W,而在非北上广 ...

  2. 字节三面:对于 Spring 你了解多少?如果你会了这 150 道题 ,吊打面试官岂不是洒洒水

    前言 Spring 框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶. 毋庸置疑,Spring 早已成为 Java 后端开发的行业标准,无数的公司选择 Spring 作为基础的 ...

  3. 腾讯内部推出”Netty速成手册“,三天走向实战,面试不是洒洒水?

    前言 #种一棵树最好的时间是十年前,其次是现在 很多程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来. 但是没过多久, ...

  4. 背废完虐面试官,字节架构师 8 年心血终成《图解设计模式》手册,拿下 offer 洒洒水啦

    引言 记得我第一次做项目的时候,当时没什么经验,开始之前也没有什么规划,想到需要啥功能就去实现啥功能,最后做到一半的时候发现进行不下去了. 这就是吃了没有把设计模式学好的亏,其实我们把程序员分成两类, ...

  5. IDEA自动导包设置(洒洒水)

    当从别的类文件中,复制代码到类文件时,其使用的依赖每次都是一个一个的Alt+ Enter 的引入,有的时候很多真的很崩溃! 第一步:File -> Settings 第二步:Editor -&g ...

  6. IP分片(一)【羊羊洒洒的Blog】

    IP分片[Fragmentation] (一) [问题]为什么会分片? 链路层通常对可传输的每个帧的最大长度有一个上限.为了保持IP数据报抽象与链路层细节的一致和分离,IP引入了分片和重组.当IP层接 ...

  7. 阿朵洒洒的撒多撒多撒啊

    能力弱又不服的人直接开除就好 转载于:https://www.cnblogs.com/diggingdeeply/p/kill_dir_no_thinking.html

  8. Wireshark的使用(一)【原创 羊羊洒洒】

    Wireshark的使用(一) Capture Several Interfaces One Time Method 1: Keep Ctrl Button pressed, and choose t ...

  9. OSCHINA开源中国

    top20:https://www.oschina.net/project/top_cn_2020 查看全文 http://www.taodudu.cc/news/show-4423902.html ...

最新文章

  1. k8s的yaml写法
  2. linux部署DM数据库的DEM系统
  3. 无线网卡的Master,Managed,ad-hoc,monitor等模式
  4. 高内聚低耦合_高渗透环氧树脂灌浆料
  5. 在c语言中load,一道题理清Objective-C中的load和initialize
  6. JavaEE基础(02):Servlet核心API用法详解
  7. 利用JavaScript实现简单的下拉菜单
  8. 我想站在巨人的肩上——记成都之行
  9. 3月国内网站流量:腾讯夺第二 360安全中心降至第三
  10. matlab单行注释,matlab注释
  11. .net项目开发工具接口说明
  12. 统计学 常用的数据分析方法大总结,推荐收藏
  13. 品质管控计划ppt怎样写_供应商质量管理工作计划.ppt
  14. 千万不要和女程序员做同事!
  15. 恭喜腾佑当选“河南省企业上云推进联盟”理事单位!
  16. 关闭 Windows Defender
  17. 分布式系统关注点——「负载均衡」到底该如何实施?
  18. 注册昵称时限制 中文7个字 字母21个
  19. 啥地方规定豆腐干豆腐
  20. android 大量代码中 grep 太慢,ReactNative 性能 - 闪电教程JSRUN

热门文章

  1. leetcode971. 翻转二叉树以匹配先序遍历
  2. Android中Kotlin面试问题讲解
  3. 算法 |【实验5.3】:一元三次方程的根-连续区间的二分搜索求近似解
  4. LTE学习笔记 ——PLMN选择
  5. 剑指offer练习日志02:基于矩阵乘法求斐波那契数列通项
  6. ROS分布式多机通信
  7. 富文本编辑器simditor
  8. java web属于什么语言_java web开发是什么
  9. python time.time()单位是秒不是毫秒
  10. 语音识别karas实现