向字符串追加字符。 提供这些函数的更安全版本;请参阅 strncat_s
、_strncat_s_l
、wcsncat_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
个字符追加到 strDest
。 strSource
的初始字符会覆盖 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
导致了缓冲区溢出。
另请参阅
字符串操作
%>
.- .
.- .
.- .
区域设置
多字节字符序列的解释