zoukankan      html  css  js  c++  java
  • strcpy之代码的健壮性与可维护性

      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),注意在这种情况下不会自动在目标串后面加''

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

    实现strcpy函数:

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

         char *strDestCopy = strDest;         

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

              throw "Invalid argument(s) ";          

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

         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的对话。

  • 相关阅读:
    设计模式
    TCP拥塞控制
    TCP 连接建立和断开,以及状态转换
    python unicode字符串
    python语法笔记(七)
    python语法笔记(六)
    python语法笔记(五)
    python语法笔记(四)
    python语法笔记(三)
    【密码学】公钥与私钥
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3627949.html
Copyright © 2011-2022 走看看