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里面的函数。