已知strcpy函数的原型是:

char *strcpy(char *dst, const char *src);

  1. 实现strcpy函数

  2. 解释为什么要返回char *

  3. 假如考虑dst和src内存重叠的情况,strcpy该怎么实现

1.strcpy的实现代码

char * strcpy(char *dst,const char *src)   //[1]
{assert(dst != NULL && src != NULL);    //[2]char *ret = dst;  //[3]while ((*dst++=*src++)!='\0'); //[4]return ret;
}

解释如下:

[1]const修饰

源字符串参数用const修饰,防止修改源字符串。

[2]空指针检查

(A)不检查指针的有效性,说明答题者不注重代码的健壮性。

(B)检查指针的有效性时使用assert(!dst && !src);

char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。

(C)检查指针的有效性时使用assert(dst != 0 && src != 0);

直接使用常量(如本例中的0)会减少程序的可维护性。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

[3]返回目标地址

(A)忘记保存原始的strdst值。

[4]'\0'

(A)循环写成while (*dst++=*src++);明显是错误的。

(B)循环写成while (*src!='\0') *dst++=*src++;

循环体结束后,dst字符串的末尾没有正确地加上'\0'。

2.为什么要返回char *?

返回dst的原始值使函数能够支持链式表达式。

链式表达式的形式如:

int l=strlen(strcpy(strA,strB));

又如:

char * strA=strcpy(new char[10],strB);

返回strSrc的原始值是错误的。

其一,源字符串肯定是已知的,返回它没有意义。

其二,不能支持形如第二例的表达式。

其三,把const char *作为char *返回,类型不符,编译报错。

3.假如考虑dst和src内存重叠的情况,strcpy该怎么实现

char s[10]="hello";

strcpy(s, s+1); //应返回ello,

//strcpy(s+1, s); //应返回hhello,但实际会报错,因为dst与src重叠了,把'\0'覆盖了

所谓重叠,就是src未处理的部分已经被dst给覆盖了,只有一种情况:src<=dst<=src+strlen(src)

C函数memcpy自带内存重叠检测功能,下面给出memcpy的实现my_memcpy。

char * strcpy(char *dst,const char *src)
{assert(dst != NULL && src != NULL);char *ret = dst;my_memcpy(dst, src, strlen(src)+1);return ret;
}

my_memcpy的实现如下

char *my_memcpy(char *dst, const char* src, int cnt)
{assert(dst != NULL && src != NULL);char *ret = dst; if (dst >= src && dst <= src+cnt-1) //内存重叠,从高地址开始复制{dst = dst+cnt-1;src = src+cnt-1;while (cnt--)*dst-- = *src--;}else    //正常情况,从低地址开始复制{while (cnt--)*dst++ = *src++;}return ret;
}

转载自:http://www.cnblogs.com/chenyg32/

转载于:https://blog.51cto.com/qiaopeng688/1844278

高效代码之strcpy()实现相关推荐

  1. Java编码技巧之高效代码50例

    来自:高德技术 导读:世界上只有两种物质:高效率和低效率:世界上只有两种人:高效率的人和低效率的人.--萧伯纳 同理,世界上只有两种代码:高效代码和低效代码:世界上只有两种人:编写高效代码的人和编写低 ...

  2. 省时省力!这些Python高效代码片段必须牢记

    我的上级领导是一个技术狂人,他在技术上的涉猎非常广泛,而且对技术的自我要求蛮高. 他经常看我们写的代码,挂在嘴边的一句话是:你们的代码像屎一样,都是垃圾! 我们听到后只能默默承受,物理反驳. 他经常劝 ...

  3. 【 持续更新 】Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 。

    [持续更新]Android开发笔记汇总篇,爬各种坑,敲高效代码,各种奇难杂症,有您要治的病 . 一.AndroidStudio 开发工具的那些事 . 问题 1: AndroidStudio2.2以上在 ...

  4. JavaScript工作原理(二):V8引擎和5招高效代码

    本系列的第一篇文章重点介绍了引擎,运行时和调用栈的概述.第二篇文章将深入V8的JavaScript引擎的内部.我们还会提供一些关于如何编写更好的JavaScript代码的技巧. 概述 JavaScri ...

  5. 9个JavaScript小技巧:写出更简洁,高效代码

    JavaScript一直在变化进步着,这儿列举了一些小技巧帮你在2019年写出更简洁,高效的可拓展的代码.下面共列举了9个讲究使用的小技巧来帮助你成为更好的开发者. 1. async / await ...

  6. 极高效代码(C语言):1008 数组元素循环右移问题 (20分)

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将 ...

  7. 从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学

    说起大小写字母转换,大家很容易想起系统函数是不是,几乎所有的编程语言都提供了这种转换函数,但是你有没有想过这背后是怎么实现的? 让你写怎么实现? 我们都知道Nginx是目前用的最多的Http服务器,那 ...

  8. java高效代码_Java工程师该如何编写高效代码?

    在调试 JS 代码时,很多人倾向于使用 alert() 或者 console.log() 方法来输出信息,正如某些 Java 程序员喜欢在调试代码时使用System.out.println() 输出信 ...

  9. eladmin代码自动生成_高效代码自动化生成

    最效率的代码自动化 前言 今天我们来看一下springboot中使用mybatis来自动生成代码,以前做ssh框架的时候实体和映射经常自己新建,浪费大量的时间,不过hibernate,到现在还是那么的 ...

最新文章

  1. 边做边思考,谷歌大脑提出并发RL算法,机械臂抓取速度提高一倍!
  2. python找不到tushare_python tushare
  3. iOS应用国际化教程(2014版)
  4. [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]
  5. redis——sentinel
  6. java ee无法安装_为什么要导入javax.servlet。*; 安装Java EE仍无法解决 面向Java EE开发人员的Eclipse...
  7. strcpy完整版 与 strcpy为什么有返回值
  8. 加载gif图片的方法:(需要SDWebImage方法)
  9. Cadence学习笔记
  10. 计算机统计分析spss试卷,《SPSS计算机统计分析方法》习题A卷.doc
  11. prolog与python_python中prolog事实词法分析器
  12. CTRL键不能使用(非硬件问题)
  13. 【UML】——活动图
  14. 用java实现网络爬虫,实时获取中国地震台网数据
  15. Android权限申请
  16. 之江汇空间如何加音乐背景_互动课堂的使用|之江汇互动课堂如何使用?之江汇互动课堂使用方法...
  17. java脏字过滤_分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤...
  18. 鸿蒙系统能装CAD吗,64位cad能装到32位的系统上吗
  19. Windows批处理方式实现MySQL定期自动备份
  20. php即时聊天数据库设计入门经典教程_用PHP+MySQL搭建聊天室

热门文章

  1. springmvc的过程及源码初涉
  2. 数据库 Oracle数据库对象二
  3. 【转】Pro Android学习笔记(一):Android 平台 2013.6.4
  4. Fedora最小化安装后没有ifconfig命令
  5. [转]Ubuntu 常用快捷键10个
  6. JAVA异常使用_每个人都曾用过、但未必都用得好
  7. SpringMVC自学日志01(回顾servlet)
  8. parameterType 属性、typeAliases 别名
  9. URL 地址含汉字无法解析问题
  10. mysql 存储微信昵称乱码_MYSQL 保存微信昵称特殊字符报错解决方法-设置编码集为utf8mb4的方法...