strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l
The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.
The latest version of this topic can be found at strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l.
Appends up to the specified number of characters of a source string to a destination string. More secure versions of these functions are available. For information, see strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l .
Important
_mbsncat
and _mbsncat_l
cannot be used in applications that execute in the Windows Runtime. For more information, see CRT functions not supported with /ZW.
Syntax
char *strncat(
char *strDest,
const char *strSource,
size_t count);
wchar_t *wcsncat(
wchar_t *strDest,
const wchar_t *strSource,
size_t count);
unsigned char *_mbsncat(
unsigned char *strDest,
const unsigned char *strSource,
size_t count);
unsigned char *_mbsncat_l(
unsigned char *strDest,
const unsigned char *strSource,
size_t count,
_locale_t locale);
template <size_t size>
char *strncat(
char (&strDest)[size],
const char *strSource,
size_t count); // C++ only
template <size_t size>
wchar_t *wcsncat(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count); // C++ only
template <size_t size>
unsigned char *_mbsncat(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count); // C++ only
template <size_t size>
unsigned char *_mbsncat_l(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count,
_locale_t locale); // C++ only
Parameters
strDest
Null-terminated destination string.
strSource
Null-terminated source string.
count
Maximum number of characters to append.
locale
Locale to use.
Return Value
Returns a pointer to the destination string. No return value is reserved to indicate an error.
Remarks
The strncat
function appends, at most, the first count
characters of strSource
to strDest
. The initial character of strSource
overwrites the terminating null character of strDest
. If a null character appears in strSource
before count
characters are appended, strncat
appends all characters from strSource
, up to the null character. If count
is greater than the length of strSource
, the length of strSource
is used in place of count
. In all cases, the resulting string is terminated with a null character. If copying takes place between strings that overlap, the behavior is undefined.
Important
strncat
does not check for sufficient space in strDest
; it is therefore a potential cause of buffer overruns. Keep in mind that count
limits the number of characters appended; it is not a limit on the size of strDest
. For details, see the examples below. For more information, see Avoiding Buffer Overruns.
wcsncat
and _mbsncat
are wide-character and multibyte-character versions of strncat
. The string arguments and return value of wcsncat
are wide-character strings; those of _mbsncat
are multibyte-character strings. These three functions behave identically otherwise.
The output value is affected by the setting of the LC_CTYPE
category setting of the locale; see setlocale for more information. The versions of these functions without the _l
suffix use the current locale for this locale-dependent behavior; the versions with the _l
suffix are identical except that they use the locale parameter passed in instead. For more information, see Locale.
In C++, these functions have template overloads. For more information, see Secure Template Overloads.
Generic-Text Routine Mappings
TCHAR.H routine | _UNICODE & _MBCS not defined | _MBCS defined | _UNICODE defined |
---|---|---|---|
_tcsncat |
strncat |
_mbsnbcat |
wcsncat |
_tcsncat_l |
_strncat_l |
_mbsnbcat_l |
_wcsncat_l |
Note
_strncat_l
and _wcsncat_l
have no locale dependence and are not meant to be called directly. They are provided for internal use by _tcsncat_l
.
Requirements
Routine | Required header |
---|---|
strncat |
<string.h> |
wcsncat |
<string.h> or <wchar.h> |
_mbsncat |
<mbstring.h> |
_mbsncat_l |
<mbstring.h> |
For additional compatibility information, see Compatibility.
Example
// crt_strncat.c
// Use strcat and strncat to append to a string.
// Compile by using: cl /W4 crt_strncat.c
// To disable security deprecation warnings for strncat and strcpy,
// define this symbol before you include any standard headers:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSTRINGLEN 39
// struct to show what happens if a buffer overrun occurs.
struct {
char dest[MAXSTRINGLEN+1]; // The target of our writes
char safe[MAXSTRINGLEN+1]; // The next part of memory
} strings;
void BadAppend(char suffix[], int n)
{
strncat(strings.dest, suffix, n);
// Bad: There is no check to see if up to n characters of
// suffix can fit into the destination along with a terminating null.
}
void BadAppend2(char suffix[])
{
strncat(strings.dest, suffix, _countof(strings.dest));
// Bad: attempts to write the total number of characters
// allocated for the destination, starting after the characters
// already in the destination.
}
void BadAppend3(char suffix[])
{
strncat(strings.dest, suffix,
_countof(strings.dest) - strlen(strings.dest));
// Bad: does not account for the terminating null.
}
void GoodAppend(char suffix[], size_t n)
{
strncat(strings.dest, suffix,
__min(n, _countof(strings.dest) - strlen(strings.dest) - 1));
// Good: does not append more than the number of characters
// available in the destination and leaves room for the null.
}
void init_strings()
{
strcpy(strings.dest, "This is a 25-char string!");
strcpy(strings.safe, "This wasn't overwritten by strncat.");
}
void report_results(char function_name[])
{
printf("After %s : %s (%d chars)\n",
function_name, strings.dest, strlen(strings.dest));
printf("buffer overrun check : %s\n", strings.safe);
}
int main(void)
{
// Initialize the destination string with 25 characters and
// the overrun check buffer with a test string.
init_strings();
printf("strings.dest can hold up to %d characters plus a null.\n",
MAXSTRINGLEN);
printf("If the check buffer isn't overrun, it contains:\n%s\n\n",
strings.safe);
// Append 20 characters to the string.
BadAppend("Extra text to add to the string...", 20);
report_results("BadAppend");
init_strings();
// Append up to the length of the destination string.
BadAppend2("Extra text to add to the string...");
report_results("BadAppend2");
init_strings();
// Append up to the length of the destination string minus
// the number of characters already in the string.
BadAppend3("Extra text to add to the string...");
report_results("BadAppend3");
init_strings();
// Append up to the length of the destination string minus
// the number of characters already in the string and one for
// the terminating null, or 20, whichever is smaller.
GoodAppend("Extra text to add to the string...", 20);
report_results("GoodAppend");
}
strings.dest can hold up to 39 characters plus a null.
If the check buffer isn't overrun, it contains:
This wasn't overwritten by strncat.
After BadAppend : This is a 25-char string!Extra text to add to (45 chars)
buffer overrun check : dd to
After BadAppend2 : This is a 25-char string!Extra text to add to the string... (59 chars)
buffer overrun check : dd to the string...
After BadAppend3 : This is a 25-char string!Extra text to a (40 chars)
buffer overrun check :
After GoodAppend : This is a 25-char string!Extra text to (39 chars)
buffer overrun check : This wasn't overwritten by strncat.
See Also
String Manipulation
_mbsnbcat, _mbsnbcat_l
strcmp, wcscmp, _mbscmp
strcpy, wcscpy, _mbscpy
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr, wcsrchr, _mbsrchr, _mbsrchr_l
_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l
strspn, wcsspn, _mbsspn, _mbsspn_l
Locale
Interpretation of Multibyte-Character Sequences