strcpy   函数的原型是: char * strcpy(char * strDest,const char * strSrc);

   功能:把从strSrc地址开始且含有NULL结束符的字符串复制到以strDest开始的地址空间,返回指向strDest的指针。

说明:strSrc和strDest所指内存区域不可以重叠strDest必须有足够的空间来容纳strSrc的字符串。

与strncpy   函数进行对比:

strncpy  函数的原型是: char * strncpy( char *dest, char *src, size_t num );

下面的例子可以看出strcpy和strncpy的区别:

char* p="how are you ?";

char name[10];

strcpy(name,p); //目标串长度小于源串,错误!

strncpy(name,p,sizeof(name)); //源串长度大于指定拷贝的长度sizeof(name),注意在这种情况下不会自动在目标串后面加'\0'

name[sizeof(name)-1]='\0'; //和上一步组合,弥补结果

实现strcpy函数:

char *strcpy(char *strDest,const char *strSrc)    {

     char *strDestCopy = strDest;

   if ( (NULL == strDest) || (NULL==strSrc) )

         throw "Invalid argument(s) ";

     while ( (*strDestCopy++ = *strSrc++) != '\0' );

     return strDest;

}

说明:

1.为了代码的健壮性,需注重指针的有效性。

   指针保存0值,表示它不指向任何对象。可以使用C++语言从C语言中继承下来的预处理器变量NULL,该变量在cstdlib头文件定义,其值为0.如果在代码中使用了这个预处理器变量,则编译器会自动被数值0替换。预处理器变量不是在std命名空间中定义的,因此其名字应为NULL,而非std::NULL。

     不用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),原因为:用作条件的表达式被隐式转换为bool型,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。

     检查指针的有效性时不用((strDest==0)||(strSrc==0)),如果直接使用字面常量(如本例中的0)就会减少程序的可维护性。使用常量(比如NULL)的好处:可维护性强,如果程序中多次出现,某次书写笔误,编译器就会检测出来。

2.throw部分,抛出异常代替返回值,使错误不会被忽略、增强程序的可维护性。如果触发throw,就会出现debug error的对话。

strcpy之代码的健壮性与可维护性的更多相关文章

  1. PC-lint集成于SourceInsight 范例以及简单分析;提高代码的健壮性;

    写代码之际突然想起了pc-lint这个"古董级"的代码静态分析工具;   下午机房的服务器歇菜了,没法调试游戏,刚好抽出时间来研究一下pc-lint集成在SourceInsight ...

  2. 使用flow提升js代码的健壮性

    https://www.jianshu.com/p/7716dc8b2206    Flow基本语法及使用 https://www.cnblogs.com/tianxiangbing/p/flow.h ...

  3. 人生苦短之Python函数的健壮性

    如何评论一个开发代码写的好?清晰简洁明了?No,No,一个处女座就可以写出来了,整齐地代码,详细的注释不是代码好的标准,应该说不是最重要的标准.代码写的是否健壮才是检验的重要标准. 代码的健壮性: 当 ...

  4. TestOps - 最健壮性的测试角色

    一十一 发表于 2018-03-02 09:10:08 TestOps   最具影响力的测试运维一体化综合平台. DevOps实现了从代码到服务的快速落地,而TestOps集成了DevOps效率,更是 ...

  5. 【转】自动化测试框架: pytest&allure ,提高自动化健壮性和稳定性

    序 在之前,我写过一个系列“从零开始搭建一个简单的ui自动化测试框架(pytest+selenium+allure)”,在这个系列里,主要介绍了如何从零开始去搭建一个可用的自动化工程框架,但是还缺乏了 ...

  6. tcp连接出现close_wait状态?可能是代码不够健壮

    一.问题概述 今天遇到个小问题. 我们的程序依赖了大数据那边的服务,大数据那边提供了restful接口供我们调用. 测试反映接口有问题,我在本地重现了. 我这边感觉抓包可能对分析问题有用,就用wire ...

  7. 程序try-catch的绝对健壮性之嵌套

    写程序的过程中,我们对try-catch在熟悉不过了,捕获异常进行处理,以保证程序的健壮性. 今日突发一想,如果我们catch中的代码异常了怎么办?我们做以下一种假设 static void Main ...

  8. 程序的健壮性Robustness

    所谓的程序健壮性是指处理异常的能力,在异常中能够独立处理异常,并且把正确的答案输出. 例如: 有一个程序能够下载一个文件到指定的路径,但是这个路径是不存在的,因此程序必须要处理这个情况. 例1:下面的 ...

  9. 使用 CSS perfer-* 规范,提升网站的可访问性与健壮性

    文本将介绍 CSS 媒体查询中新增的几个特性功能: prefers-reduced-motion prefers-color-scheme prefers-contrast prefers-reduc ...

随机推荐

  1. quick 截屏

    MainScene local MainScene = class("MainScene", function() return display.newScene("Ma ...

  2. BZOJ3847 : ZCC loves march

    注意到集结操作相当于合并一些点 于是我们可以使用并查集 对于每一行.每一列维护一个链表,储存里面的点 查询x时,在并查集中找到x的祖先u,此时x的坐标就是u的坐标 然后扫描u所在行列的链表,依次删除每 ...

  3. ios7隐藏系统底部导航

    ios7隐藏系统底部导航 minimal-ui <meta id="viewport" name="viewport" content="wid ...

  4. 【TYVJ】1307 联络员(最小生成树)

    http://tyvj.cn/Problem_Show.aspx?id=1307 kruskal裸题.(水题红色警报) #include <cstdio> #include <cst ...

  5. Sqlserver 存储过程中结合事务的代码

    Sqlserver 存储过程中结合事务的代码  --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ ...

  6. 【C语言】10-字符和字符串常用处理函数

    一.字符处理函数 下面介绍的两个字符处理函数都是在stdio.h头文件中声明的. 1.字符输出函数putchar putchar(65); // A putchar('A'); // A int a ...

  7. eclipse java工程和maven工程的互相转换

    eclipse java工程和maven工程的互相转换 maven转为工程一般工程: 工程右键--->Maven--->Disable Maven Nature转为一般工程. 一般工程转为 ...

  8. SQL Server 收缩数据库

    //删除大量数据 /*** * * BEGIN TRANSACTION; * SELECT * INTO #keep FROM Original WHERE CreateDate > '2011 ...

  9. PHP对于Session漏洞的防范

    目前,基于PHP的网站开发已经成为目前网站开发的主流,本文笔者重点从PHP网站攻击与安全防范方面进行探究,旨在减少网站漏洞,希望对大家有所帮助! 一.常见PHP网站安全漏洞 对于PHP的漏洞,目前常见 ...

  10. sql 语句大小写的问题

    关键字不区分大小写 例如 select ,from, 大小写均可 标识符区分大小写 例如 表名,列名 标识符如果不加双引号,默认是按大写执行 标识符如果加双引号,则是按原始大小写执行 但是,当表名加上 ...