文字列の文字を追加します。 これらの関数のセキュリティを強化したバージョンを使用できます。「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
関数は、count
に、strSource
の先頭の最大 strDest
文字を追加します。 strSource
の先頭の文字は、strDest
の終端の null 文字を上書きします。 strSource
バイトが追加される前に count
に null 文字があった場合は、strncat
は null 文字までの strSource
内のすべての文字を追加します。 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 |
Note
_strncat_l
および _wcsncat_l
はロケールに依存せず、直接呼び出すためのものではありません。 これらは、_tcsncat_l
による内部使用のために用意されています。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
strncat |
<string.h> |
wcsncat |
<string.h> または <wchar.h> |
_mbsncat |
<mbstring.h> |
_mbsncat_l |
<mbstring.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// 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
により生じたバッファー オーバーランを確認できます。