strcpy, strncpy, strlcpy的区别

来源:互联网 发布:qq群排名优化软件免费 编辑:程序博客网 时间:2024/04/30 08:15

1.strcpy 此函数历史最悠久,很早就出现在标准库里,由于当初的程序员认识不够,该函数的行为会造成缓冲区溢出。下面是溢出的例子:

 

char name[2];

char *p = "hello world!";

strcpy (name, p);

 

strcpy没有做检查,只是单纯地把一个字符串拷贝到另外一个线性空间,不会检查有没有足够的空间来保存该字符串(例如"hello world!",就全部拷贝到p,!号后面有个/0,strcpy遇到/0结束拷贝),于是造成溢出。

 

2.strncpy 函数是strcpy的安全版,它有个缺点就是要手动加/0来结束一个字符串。

   strncpy:

                  如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。   
                  如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。   
                  src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。   
                  返回指向dest的指针。

 

 

strncpy 的标准用法为:(手工写上 /0)

strncpy(path, src, sizeof(path) - 1);
path[sizeof(path) - 1] = '/0';
len = strlen(path);

 

 

3.strlcpy 函数只有linux中才有提供,Windows 下是没有 strlcpy 的,对应的是strcpy_s函数。strlcpy与strncpy功能相类似,但会帮你加上/0,第3个参数不是拷贝的长度,而是目的缓冲区的大小。strlcpy不属于ANSI C,前面两个函数是ANSI C里面的函数。