首先说下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。 性能上它们不一定有多大差别。 |