# strncat

## NAME



           strncat - append non-null bytes from a source array to a string,
           and null-terminate the result
    


## LIBRARY



           Standard C library (_libc_ , _-lc_)
    


## SYNOPSIS



           **#include <string.h>**
    
           **char *strncat(** size_t ssize;
                         **char *restrict** _dst_**, const char** _src_**[restrict** _ssize_**],**
                         **size_t** _ssize_**);**
    


## DESCRIPTION



           This function appends at most _ssize_ non-null bytes from the array
           pointed to by _src_ , followed by a null character, to the end of the
           string pointed to by _dst_.  _dst_ must point to a string contained in
           a buffer that is large enough, that is, the buffer size must be at
           least _strlen(dst) + strnlen(src, ssize) + 1_.
    
           An implementation of this function might be:
    
               char *
               strncat(char *restrict dst, const char *restrict src, size_t ssize)
               {
                   #define strnul(s)  (s + strlen(s))
    
                   stpcpy(mempcpy(strnul(dst), src, strnlen(src, ssize)), "");
                   return dst;
               }
    


## RETURN VALUE



           **strncat**() returns _dst_.
    


## ATTRIBUTES



           For an explanation of the terms used in this section, see
           attributes(7).
           ┌──────────────────────────────────────┬───────────────┬─────────┐
           │ **Interface** │ **Attribute** │ **Value** │
           ├──────────────────────────────────────┼───────────────┼─────────┤
           │ **strncat**()                            │ Thread safety │ MT-Safe │
           └──────────────────────────────────────┴───────────────┴─────────┘
    


## STANDARDS



           C11, POSIX.1-2008.
    


## CAVEATS



           The name of this function is confusing; it has no relation to
           strncpy(3).
    
           If the destination buffer does not already contain a string, or is
           not large enough, the behavior is undefined.  See **_FORTIFY_SOURCE**
           in feature_test_macros(7).
    


## BUGS



           This function can be very inefficient.  Read about Shlemiel the
           painter 
           ⟨https://www.joelonsoftware.com/2001/12/11/back-to-basics/⟩.
    


## EXAMPLES



           #include <err.h>
           #include <stdio.h>
           #include <stdlib.h>
           #include <string.h>
    
           #define nitems(arr)  (sizeof((arr)) / sizeof((arr)[0]))
    
           int
           main(void)
           {
               size_t  n;
    
               // Null-padded fixed-size character sequences
               char    pre[4] = "pre.";
               char    new_post[50] = ".foo.bar";
    
               // Strings
               char    post[] = ".post";
               char    src[] = "some_long_body.post";
               char    *dest;
    
               n = nitems(pre) + strlen(src) - strlen(post) + nitems(new_post) + 1;
               dest = malloc(sizeof(*dest) * n);
               if (dest == NULL)
                   err(EXIT_FAILURE, "malloc()");
    
               dest[0] = '\0';  // There's no 'cpy' function to this 'cat'.
               strncat(dest, pre, nitems(pre));
               strncat(dest, src, strlen(src) - strlen(post));
               strncat(dest, new_post, nitems(new_post));
    
               puts(dest);  // "pre.some_long_body.foo.bar"
               free(dest);
               exit(EXIT_SUCCESS);
           }
    


* * *