strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

向字符串追加字符。 提供这些函数的更安全版本;请参阅 strncat_s_strncat_s_lwcsncat_s_wcsncat_s_l_mbsncat_s_mbsncat_s_l

重要

_mbsncat_mbsncat_l 无法用于在 Windows 运行时中执行的应用程序。 有关详细信息,请参阅通用 Windows 平台应用中不支持的 CRT 函数

语法

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

参数

strDest
null 终止的目标字符串。

strSource
null 终止的源字符串。

count
要追加的字符数。

locale
要使用的区域设置。

返回值

返回一个指向目标字符串的指针。 没有保留任何返回值以指示错误。

注解

strncat 函数最多可以将 strSource 的前 count 个字符追加到 strDeststrSource 的初始字符会覆盖 strDest 的终止 null 字符。 如果在追加 count 个字符之前 strSource 中出现一个 null 字符,则 strncat 将追加 strSource 中此 null 字符前的所有字符。 如果 count 大于 strSource 的长度,则会使用 strSource 的长度代替 count。 在所有情况下,结果字符串以 null 字符终止。 如果复制出现在重叠的字符串之间,则该行为不确定。

重要

strncat 不检查 strDest 中是否有足够的空间;因此,这可能会导致缓冲区溢出。 请记住,count 只是限制追加的字符数,不是 strDest 的大小限制。 请参阅以下示例。 有关详细信息,请参阅避免缓冲区溢出

wcsncat_mbsncat 分别是 strncat 的宽字符及多字节字符版本。 wcsncat 的字符串自变量和返回值为宽字符字符串。 _mbsncat 的字符串自变量和返回值为多字节字符字符串。 否则这三个函数否则具有相同行为。

输出值受区域设置的 LC_CTYPE 类别设置的影响。 有关详细信息,请参阅 setlocale。 不带 _l 后缀的这些函数的版本会将当前区域设置用于此区域设置的相关行为。 带 _l 后缀的版本是相同的,只不过它们转而使用传入的区域设置参数。 有关详细信息,请参阅 Locale

在 C++ 中,这些函数具有模板重载。 有关详细信息,请参阅安全模板重载

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态

一般文本例程映射

TCHAR.H 例程 _UNICODE_MBCS 未定义 _MBCS 已定义 _UNICODE 已定义
_tcsncat strncat _mbsnbcat wcsncat
_tcsncat_l _strncat_l _mbsnbcat_l _wcsncat_l

注意

_strncat_l_wcsncat_l 没有区域设置相关性,并且不应直接调用。 它们供 _tcsncat_l 内部使用。

要求

例程 必需的标头
strncat <string.h>
wcsncat <string.h> 或 <wchar.h>
_mbsncat <mbstring.h>
_mbsncat_l <mbstring.h>

有关兼容性的详细信息,请参阅 兼容性

示例

// crt_strncat.c
// Use strcat and strncat to append to a string.
#include <stdlib.h>

#define MAXSTRINGLEN 39

char string[MAXSTRINGLEN+1];
// or char *string = malloc(MAXSTRINGLEN+1);

void BadAppend( char suffix[], int n )
{
   strncat( string, suffix, n );
}

void GoodAppend( char suffix[], size_t n )
{
   strncat( string, suffix, __min( n, MAXSTRINGLEN-strlen(string)) );
}

int main( void )
{
   string[0] = '\0';
   printf( "string can hold up to %d characters\n", MAXSTRINGLEN );

   strcpy( string, "This is the initial string!" );
   // concatenate up to 20 characters...
   BadAppend( "Extra text to add to the string...", 20 );
   printf( "After BadAppend :  %s (%d chars)\n", string, strlen(string) );

   strcpy( string, "This is the initial string!" );
   // concatenate up to 20 characters...
   GoodAppend( "Extra text to add to the string...", 20 );
   printf( "After GoodAppend:  %s (%d chars)\n", string, strlen(string) );
}

输出

string can hold up to 39 characters
After BadAppend :  This is the initial string!Extra text to add to (47 chars)
After GoodAppend:  This is the initial string!Extra text t (39 chars)

你可以看到 BadAppend 导致了缓冲区溢出。

另请参阅

字符串操作
_mbsnbcat, _mbsnbcat_l
strcatwcscat_mbscat
strcmpwcscmp_mbscmp
strcpywcscpy_mbscpy
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
strncpy_strncpy_lwcsncpy_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
区域设置
多字节字符序列的解释