strlcpy和strlcat

strncpy 等主要的问题还是虽然不会溢出,但是满了就不给缓冲区添加0结束符了,以前在项目里面自己还写了个 safe_strcpy 现在发现早就有了

 

http://blog.csdn.net/linyt/article/details/4383328

 

找了一下,代码可以在 libbsd 里面有

 

 

/*
  * Appends src to string dst of size siz (unlike strncat, siz is the
  * full size of dst, not space left).  At most siz-1 characters
  * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
  * Returns strlen(src) + MIN(siz, strlen(initial dst)).
  * If retval >= siz, truncation occurred.
  */
size_t
strlcat( char  *dst,  const  char  *src,  size_t  siz)
{
         char  *d = dst;
         const  char  *s = src;
         size_t  n = siz;
         size_t  dlen;
 
         /* Find the end of dst and adjust bytes left but don't go past end */
         while  (n-- != 0 && *d !=  '\0' )
                 d++;
         dlen = d - dst;
         n = siz - dlen;
 
         if  (n == 0)
                 return (dlen +  strlen (s));
         while  (*s !=  '\0' ) {
                 if  (n != 1) {
                         *d++ = *s;
                         n--;
                 }
                 s++;
         }
         *d =  '\0' ;
 
         return (dlen + (s - src));        /* count does not include NUL */
}
 
/*
  * Copy src to string dst of size siz.  At most siz-1 characters
  * will be copied.  Always NUL terminates (unless siz == 0).
  * Returns strlen(src); if retval >= siz, truncation occurred.
  */
size_t
strlcpy( char  *dst,  const  char  *src,  size_t  siz)
{
         char  *d = dst;
         const  char  *s = src;
         size_t  n = siz;
 
         /* Copy as many bytes as will fit */
         if  (n != 0) {
                 while  (--n != 0) {
                         if  ((*d++ = *s++) ==  '\0' )
                                 break ;
                 }
         }
 
         /* Not enough room in dst, add NUL and traverse rest of src */
         if  (n == 0) {
                 if  (siz != 0)
                         *d =  '\0' ;               /* NUL-terminate dst */
                 while  (*s++)
                         ;
         }
 
         return (s - src - 1);     /* count does not include NUL */
}

 

你可能感兴趣的:(cat)