随笔 - 50  文章 - 8  trackbacks - 0
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿

随笔档案

Blogs

搜索

  •  

最新评论

阅读排行榜

评论排行榜

在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    <string.h>

 

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

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

 

【答案】 Hell1234567890  Hell

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/09/05/5864093.aspx

posted on 2010-09-05 03:40 sohu2000000 阅读(1455) 评论(4)  编辑 收藏 引用

FeedBack:
# re: 跟刘峰六学C语言(2) 2010-09-06 11:48 普派
在标准库里面的
strncpy是没有NULL的  回复  更多评论
  
# re: 跟刘峰六学C语言(2) 2010-09-06 13:02 Noock
CHAR *pcPoint=pcDest;

这个赋值最好还是往下放一行,在参数有NULL的时候省掉一个赋值操作  回复  更多评论
  
# re: 跟刘峰六学C语言(2)[未登录] 2010-09-06 23:29 sohu2000000
@普派

额。。。。我的意思确实是strncpy里面没有NULL也就是我说的'\0' ... ...
不知道你是不是这个意思,不是很明白
  回复  更多评论
  
# re: 跟刘峰六学C语言(2)[未登录] 2010-09-07 00:04 sohu2000000
@Noock

恩,有道理,接受批评 :)  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理