| Defined in header <string.h> | ||
|---|---|---|
| (1) | ||
| char *strcat( char *dest, const char *src ); | (until C99) | |
| char *strcat( char *restrict dest, const char *restrict src ); | (since C99) | |
| errno_t strcat_s(char *restrict dest, rsize_t destsz, const char *restrict src); | (2) | (since C11) | 
src to the end of the null-terminated byte string pointed to by dest. The character src[0] replaces the null terminator at the end of dest. The resulting byte string is null-terminated.src and dest and the terminating null character. The behavior is undefined if the strings overlap. The behavior is undefined if either dest or src is not a pointer to a null-terminated byte string.destsz) with unspecified values and that the following errors are detected at runtime and call the currently installed constraint handler function: src or dest is a null pointer destsz is zero or greater than RSIZE_MAX destsz bytes of dest dest would not fit every character, including the null terminator, of src) dest < strlen(dest)+strlen(src)+1 <= destsz; in other words, an erroneous value of destsz does not expose the impending buffer overflow. As with all bounds-checked functions, strcat_s only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including <string.h>.| dest | - | pointer to the null-terminated byte string to append to | 
| src | - | pointer to the null-terminated byte string to copy from | 
| destsz | - | maximum number of characters to write, typically the size of the destination buffer | 
dest
dest[0] (unless dest is a null pointer or destsz is zero or greater than RSIZE_MAX).Because strcat needs to seek to the end of dest on each call, it is inefficient to concatenate many strings into one using strcat.
strcat_s is allowed to clobber the destination array from the last character written up to destsz in order to improve efficiency: it may copy in multibyte blocks and then check for null bytes.
The function strcat_s is similar to the BSD function strlcat, except that
strlcat truncates the source string to fit in the destination strlcat does not perform all the runtime checks that strcat_s does strlcat does not make failures obvious by setting the destination to a null string or calling a handler if the call fails. Although strcat_s prohibits truncation due to potential security risks, it's possible to truncate a string using bounds-checked strncat_s instead.
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h> 
#include <stdio.h>
#include <stdlib.h>
 
int main(void) 
{
    char str[50] = "Hello ";
    char str2[50] = "World!";
    strcat(str, str2);
    strcat(str, " ...");
    strcat(str, " Goodbye World!");
    puts(str);
 
#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = strcat_s(str, sizeof str, " ... ");
    printf("str = \"%s\", r = %d\n", str, r);
    r = strcat_s(str, sizeof str, " and this is too much");
    printf("str = \"%s\", r = %d\n", str, r);
#endif
}Possible output:
Hello World! ... Goodbye World! str = "Hello World! ... Goodbye World! ... ", r = 0 str = "", r = 22
| (C11) | concatenates a certain amount of characters of two strings (function) | 
| (C11) | copies one string to another (function) | 
| (C23) | copies one buffer to another, stopping after the specified delimiter (function) | 
| C++ documentation for strcat | |
    © cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
    https://en.cppreference.com/w/c/string/byte/strcat