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

  • 相关阅读:
    卡特兰数
    hdu 1023 Train Problem II
    hdu 1022 Train Problem
    hdu 1021 Fibonacci Again 找规律
    java大数模板
    gcd
    object dection资源
    Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
    softmax sigmoid
    凸优化
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3627949.html
Copyright © 2011-2022 走看看