跟刘峰六学C语言(2)

在VRP平台中,实现了strncpy类似的函数,定义如下

   1: #define CHAR  char   
   2: #define ULONG unsigned long   
   3: #define VOID  void   
   4:  
   5: #define MACRO_COPYWORLDLENGTH    4   
   6:  
   7: CHAR *VOS_strncpy(CHAR *pcDest, const CHAR *szSrc, ULONG ulLength)   
   8: {   
   9:     CHAR *pcPoint=pcDest;  
  10:  
  11:     if((NULL==szSrc)||(NULL==pcDest))  
  12:     {  
  13:             return NULL;  
  14:     }
  15:    
  16:      while(ulLength && (*pcPoint=*szSrc))  
  17:      {
  18:          pcPoint++;
  19:          szSrc++;
  20:          ulLenght--;
  21:      }
  22:      if(!ulLength)
  23:      {
  24:           *pcPoint='/0';
  25:      }
  26:      return pcDest;
  27: }
  28:  
  29: void main(void)
  30: {
  31:      CHAR szStrBuf[] ="1234567890";
  32:      CHAR szStrBuf1[]="1234567890";
  33:      CHAR *szHelloWorld = "Hello World!"
  34:      strncpy(szStrBuf, szHelloWorld, MACRO_COPYWORLDLENGTH);
  35:      VOS_strncpy(szStrBuf1, szHelloWorld, MACRO_COPYWORLDLENGTH);
  36:      printf("%s %s", szStrBuf, szStrBuf1);
  37: }

 

 

程序的输出结果是_____

【分析与解答】

          这个程序考察的是对C字符串处理内部机制的了解情况。
         cstring一族中:  strlen(const char* str) 返回的是字符串的长度,不包含 ‘/0’

                                    所以对strcpy的调用我们一般都是 :

                                          char * copy = new char[strlen(src)+1];
                                          strncpy(copy,src,strlen(src)); // strncpy 如果没有指定长度,那么同样也是不会复制’/0’的
                                          copy[strlen(src)+1]=’/0’

          为什么会不去复制’/0’呢?

          因为cstring库是memory.h库的底层实现,也就是说memcpy函数的底层实现是由unsigned char 类型的strncpy实现的,所以如果加上了NULL
          那么就会发生内存的截取,从而会导致的程序退出时,不能完全的删除内存(NULL后面的部分没有删除),就会内存泄露,所以在标准库里面的
          strncpy是没有NULL的
          下面是某标注库的memory.h的定义:

   1: /*
   2:  * This file is part of the Mingw32 package.
   3:  *
   4:  * memory.h maps to the standard string.h header.
   5:  */
   6:  
   7: #include    

 

         有了这个知识点,就很容易解答上面的程序了

          第一个输出,使用的是strncpy,所以只是起到了内存的覆盖的作用,输出是覆盖掉前4个字符的字符串  Hell567890
          第二个输出,调用了我们自己的程序,其中使用了字符串截断符NULL,所以输出的结果是前四个字符 Hell

 

【答案】 Hell1234567890  Hell

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值