首页 > 其他 > 详细

strcpy ,strncpy ,strlcpy特点

时间:2015-03-23 19:51:16      阅读:336      评论:0      收藏:0      [点我收藏+]

简单描述一下三个函数: strcpy ,strncpy ,strlcpy;

1. 首先,strcpy是最不安全拷贝字符串函数,因为src串的长度有时会很长。随后strncpy函数为了解决这个问题出现了,它对于字符串末尾的’\0’处理不是很好。

例1: 

char str[12]; 

strncpy(str, "hello world", 12);

在例1中只会把str数组填满,但这个字符串却没有’\0’的结束符,另外,如果目标空间空间不足,那么会导致buffer overflow。

它的实现如下:

 charstrcpy(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;

}


strcpy ,strncpy ,strlcpy特点

原文:http://eminzhang.blog.51cto.com/5292425/1623427

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!