简单描述一下三个函数: 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;

}