strcpy,strncpy和strncpy_s的区别 strncpy函数与memcpy函数

首先说下strcpy

strcpy()是依据源串的\0作为结束判断的,不检查copy先的Buffer的Size,如果目标空间不够,就有BufferOverflow问题。

strncpy的原型为:

char * strncpy(char *dest, char *src, size_t n);

其将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针,所以,用户定义好size,就没有bufferoverfolow的风险

目前,strncpy是字符串拷贝推荐的用法

加_s版本则是从VS2005开始推出的安全版本,

而加_s版本之所以安全,是因为他们在接口增加了一个参数numElems来表明dest中的字节数,

防止目标指针dest中的空间不够而导致出现Bug,同时返回值改成返回错误代码,而不是为了一些所谓的方便而返回char*。这样接口的定义就比原来安全很多。

但是,_s版本并不是标准库,所以,不推荐使用.





函数名:   strncpy 
功     能:   串拷贝 
用     法:   char   *strncpy(char   *destin,   char   *source,   int   maxlen); 
memcpy 
功     能:   从源source中拷贝n个字节到目标destin中 

一个考字符串,一个拷贝内存内容

strncpy   
    原型:extern   char   *strncpy(char   *dest,   char   *src,   int   n); 
                
    用法:#include   <string.h> 
    
    功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。 
    
    说明: 
                如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。 
                如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。 
                src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 
                返回指向dest的指针。 
    
    举例: 
            //   strncpy.c 
            
            #include   <syslib.h> 
            #include   <string.h> 
            main() 
            { 
                char   *s= "Golden   Global   View "; 
                char   *d= "Hello,   GGV   Programmers "; 
                char   *p=strdup(s); 
                
                clrscr(); 
                textmode(0x00);     //   enable   6   lines   mode 
                                
                strncpy(d,s,strlen(s)); 
                printf( "%s\n ",d); 
                
                strncpy(p,s,strlen(d)); 
                printf( "%s ",p); 
                
                getchar(); 
                return   0; 
            } 
------------------------------ 
memcpy   
    原型:extern   void   *memcpy(void   *dest,   void   *src,   unsigned   int   count); 
    用法:#include   <string.h> 
    
    功能:由src所指内存区域复制count个字节到dest所指内存区域。 
    
    说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。 
    
    举例: 
            //   memcpy.c 
            
            #include   <syslib.h> 
            #include   <string.h> 
            main() 
            { 
                char   *s= "Golden   Global   View "; 
                char   d[20]; 
                
                clrscr(); 
                
                memcpy(d,s,strlen(s)); 
                d[strlen(s)]=0; 
                printf( "%s ",d); 
                getchar(); 
                return   0; 
            } 
  strcpy   
    原型:extern   char   *strcpy(char   *dest,char   *src); 
                
    用法:#include   <string.h> 
    
    功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 
    
    说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 
                返回指向dest的指针。 
    
    举例: 
            //   strcpy.c 
            
            #include   <syslib.h> 
            #include   <string.h> 
            main() 
            { 
                char   *s= "Golden   Global   View "; 
                char   d[20]; 
                
                clrscr(); 
                
                strcpy(d,s); 
                printf( "%s ",d); 
                getchar(); 
                return   0; 
            } 
----------------------------------------------- 
strcpy只是复制字符串,但不限制复制的数量。很容易造成缓冲溢出。 
strncpy要安全一些。 
memcpy也可以用来在内存中复制数据,由于字符串是以零结尾的,所以对于在数据中包含零的数据只能用memcpy。 
性能上它们不一定有多大差别。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值