简单描述一下三个函数: strcpy ,strncpy ,strlcpy;
1. 首先,strcpy是最不安全拷贝字符串函数,因为src串的长度有时会很长。随后strncpy函数为了解决这个问题出现了,它对于字符串末尾的’\0’处理不是很好。
例1:
char str[12];
strncpy(str, "hello world", 12);
在例1中只会把str数组填满,但这个字符串却没有’\0’的结束符,另外,如果目标空间空间不足,那么会导致buffer overflow。
它的实现如下:
char
*
strcpy
(
char
* des,
const
char
* source)
{
char
* r=des;
while
((*(des++)=*(source++))!=
'\0'
);
return
r;
}
2.看一下strncpy, 它可以说是strcpy的安全版本,但是它的缺点也是很明显的,如下所示:
char str[20];
strncpy(str, "sample", 15);//这里的15是指要复制的个数,而不是指str的空间;
可见,15远远大于了字符串"sample"的长度,这时strncpy要在剩下的部分补充’\0’。首先说这样会影响效率,其次对于static或者calloc这样已经初始化的数组根本不需要填写’\0’。
因此在使用strncpy拷贝字符串时,通常要这样写,
例2:
strncpy(path, homedir, sizeof(path) – 1);
path[sizeof(path) – 1] = ‘\0′;
3. 而strlcpy可以自动处理末尾’\0’,不需要我们手动负责\0,;
size_t strlcpy(char *dst, const char *src, size_t size);
然而strlcpy不是ANSI C函数,至今也不是标准,一般在linux下使用,该函数的实现如下:
size_t strlcpy(char *dst, const char *src, size_t size)
{
size_t len = 0;
while (++len < size && *src)
*dst++ = *src++;
if (len <= size)
*dst = 0;
return len + strlen(src) - 1;
}