Zhang Jiuan’ Notes

strcpy,strncpy,strlcpy的比较和讨论

    在本篇和下一篇日志中,将对两组函数进行讨论。一组是字符串拷贝的,另一组是内存分配的。本篇将要讨论的是字符串分配的一组函数:strcpy,strncpy,strlcpy

strcpy

    原型:char * strcpy(char *dest, const char *src);

    早期,对于标准C便形成了一组标准库,其中就包括字符串操作的。如:strcmp, strcat, strcpy等。strcpy的功能是将一个字符串的内容原样拷贝到另外一个缓存中。但它存在不安全情况,1 如果接收的缓存太小,便会引起写内存越界的情况;2 这个函数也没有对源串进行一定的判断,也就是不能保证源串的长度和结束标志。于是便有后来的strncpy和strlcpy的产生。

strncpy

    函数原型:char * strncpy(char * dest, const char *src, size_t size);

    此函数似乎有些鬼异,因为接收的size为源串的缓冲区的长度。也就是说源串中的字符最多size个字符可以拷贝到目的串中,它并没有真正解决缓冲区溢出的危险,因为此函数并没有对目的缓冲区做任何的判断。但是它的strcpy相比,已经有了很大的进步,因此它也成了标准C度的一部分。

strlcpy

    原型:char * strlcpy(char *dest, const char *src, size_t dest_buf_size);

                 int strlcpy(char *dest, const char *src, size_t dest_buf_size);

    strlcpy从根本上解决了缓冲区溢出的危险,因为dest_buf_size为目的串的缓冲区的大小,因此此函数最多往目的串中存放dest_buf_size个字符。这样不管源串的大字的缓冲区的大小,都不会造成目的缓冲的溢出情况。但是奇怪的是strlcpy函数却没有成为标准C库的一个组成成员,直到现在。由此也造成了strlcpy的多种接口形式,比如上面描述的两个函数原型。

 

thx

张久安

If you enjoyed this post, make sure you subscribe to my RSS feed!

No Comments, Comment or Ping

Reply to “strcpy,strncpy,strlcpy的比较和讨论”

You must be logged in to post a comment.

返回顶部