strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

附加字串字元。 這些函式已有更安全的版本可用,請參閱 strncat_s_strncat_s_lwcsncat_s_wcsncat_s_l_mbsncat_s_mbsncat_s_l

重要

在 Windows 執行階段中執行的應用程式中無法使用 _mbsncat_mbsncat_l。 如需詳細資訊,請參閱 CRT functions not supported in Universal Windows Platform apps (通用 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 大小的限制。 請參閱以下範例。 如需詳細資訊,請參閱 Avoiding Buffer Overruns (避免緩衝區滿溢)

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
strncmpwcsncmp_mbsncmp_mbsncmp_l
strncpy_strncpy_lwcsncpy_wcsncpy_l_mbsncpy_mbsncpy_l
_strnicmp_wcsnicmp_mbsnicmp_strnicmp_l_wcsnicmp_l_mbsnicmp_l
strrchrwcsrchr_mbsrchr_mbsrchr_l
_strset_strset_l_wcsset_wcsset_l_mbsset_mbsset_l
strspnwcsspn_mbsspn_mbsspn_l
地區設定
多位元組字元序列的解譯