strncpy、_strncpy_l、wcsncpy、_wcsncpy_l、_mbsncpy、_mbsncpy_lstrncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

文字列の文字を別の文字列にコピーします。Copy characters of one string to another. これらの関数のセキュリティを強化したバージョンを使用できます。「strncpy_s、_strncpy_s_l、wcsncpy_s、_wcsncpy_s_l、_mbsncpy_s、_mbsncpy_s_l」をご覧ください。More secure versions of these functions are available; see strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l.

重要

_mbsncpy_mbsncpy_lは、Windows ランタイムで実行されるアプリケーションでは使用できません。_mbsncpy and _mbsncpy_l cannot be used in applications that execute in the Windows Runtime. 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。For more information, see CRT functions not supported in Universal Windows Platform apps.

構文Syntax

char *strncpy(
   char *strDest,
   const char *strSource,
   size_t count
);
char *_strncpy_l(
   char *strDest,
   const char *strSource,
   size_t count,
   locale_t locale
);
wchar_t *wcsncpy(
   wchar_t *strDest,
   const wchar_t *strSource,
   size_t count
);
wchar_t *_wcsncpy_l(
   wchar_t *strDest,
   const wchar_t *strSource,
   size_t count,
   locale_t locale
);
unsigned char *_mbsncpy(
   unsigned char *strDest,
   const unsigned char *strSource,
   size_t count
);
unsigned char *_mbsncpy_l(
   unsigned char *strDest,
   const unsigned char *strSource,
   size_t count,
   _locale_t locale
);
template <size_t size>
char *strncpy(
   char (&strDest)[size],
   const char *strSource,
   size_t count
); // C++ only
template <size_t size>
char *_strncpy_l(
   char (&strDest)[size],
   const char *strSource,
   size_t count,
   locale_t locale
); // C++ only
template <size_t size>
wchar_t *wcsncpy(
   wchar_t (&strDest)[size],
   const wchar_t *strSource,
   size_t count
); // C++ only
template <size_t size>
wchar_t *_wcsncpy_l(
   wchar_t (&strDest)[size],
   const wchar_t *strSource,
   size_t count,
   locale_t locale
); // C++ only
template <size_t size>
unsigned char *_mbsncpy(
   unsigned char (&strDest)[size],
   const unsigned char *strSource,
   size_t count
); // C++ only
template <size_t size>
unsigned char *_mbsncpy_l(
   unsigned char (&strDest)[size],
   const unsigned char *strSource,
   size_t count,
   _locale_t locale
); // C++ only

パラメーターParameters

strDeststrDest
対象文字列。Destination string.

strSourcestrSource
ソース文字列。Source string.

countcount
コピーする文字数。Number of characters to be copied.

localelocale
使用するロケール。Locale to use.

戻り値Return Value

Strdestを返します。Returns strDest. エラーを示す戻り値は予約されていません。No return value is reserved to indicate an error.

RemarksRemarks

Strncpy関数は、 strsourceの最初のカウント文字をStrsourceにコピーし、 strsourceを返します。The strncpy function copies the initial count characters of strSource to strDest and returns strDest. Countstrsourceの長さ以下の場合、コピーされた文字列に null 文字が自動的に追加されることはありません。If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. Countstrsourceの長さよりも大きい場合は、コピー先の文字列に null 文字が埋め込まれ、 長さが最大になります。If count is greater than the length of strSource, the destination string is padded with null characters up to length count. ソースとコピー先の文字列が重なり合っている場合、 strncpyの動作は未定義です。The behavior of strncpy is undefined if the source and destination strings overlap.

重要

strncpyは、 strdestに十分な領域があるかどうかを確認しません。これにより、バッファーオーバーランの潜在的な原因になります。strncpy does not check for sufficient space in strDest; this makes it a potential cause of buffer overruns. Count引数を指定すると、コピーされる文字数が制限されます。Strdestのサイズに制限はありません。The count argument limits the number of characters copied; it is not a limit on the size of strDest. 次の例を参照してください。See the following example. 詳しくは、「 バッファー オーバーランの回避」をご覧ください。For more information, see Avoiding Buffer Overruns.

StrdestまたはStrdestNULLポインターの場合、またはcountが0以下の場合は、「パラメーターの検証」で説明されているように、無効なパラメーターハンドラーが呼び出されます。If strDest or strSource is a NULL pointer, or if count is less than or equal to zero, the invalid parameter handler is invoked, as described in Parameter Validation. 実行の継続が許可された場合、これらの関数は-1 を返し、 errnoEINVALに設定します。If execution is allowed to continue, these functions return -1 and set errno to EINVAL.

wcsncpy_mbsncpyは、 strncpyのワイド文字バージョンとマルチバイト文字バージョンです。wcsncpy and _mbsncpy are wide-character and multibyte-character versions of strncpy. Wcsncpy_mbsncpyの引数と戻り値は、それに応じて異なります。The arguments and return value of wcsncpy and _mbsncpy vary accordingly. それ以外では、これらの関数の動作は同じです。These six functions behave identically otherwise.

_Lサフィックスを持つこれらの関数のバージョンは、ロケールに依存する動作に現在のロケールではなく渡されたロケールを使用する点を除いて同じです。The versions of these functions with the _l suffix are identical except that they use the locale passed in instead of the current locale for their locale-dependent behavior. 詳細については、「 Locale」を参照してください。For more information, see Locale.

C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、これらの関数に対応するセキュリティで保護された新しい関数を呼び出します。In C++, these functions have template overloads that invoke the newer, secure counterparts of these functions. 詳細については、「 Secure Template Overloads」を参照してください。For more information, see Secure Template Overloads.

汎用テキスト ルーチンのマップGeneric-Text Routine Mappings

TCHAR.H のルーチンTCHAR.H routine _UNICODE および _MBCS が未定義の場合_UNICODE & _MBCS not defined _MBCS が定義されている場合_MBCS defined _UNICODE が定義されている場合_UNICODE defined
_tcsncpy_tcsncpy strncpystrncpy _mbsnbcpy_mbsnbcpy wcsncpywcsncpy
_tcsncpy_l_tcsncpy_l _strncpy_l_strncpy_l _mbsnbcpy_l_mbsnbcpy_l _wcsncpy_l_wcsncpy_l

注意

_strncpy_l_wcsncpy_lは、ロケールに依存しません。これらは _tcsncpy_lのためだけに提供されており、直接呼び出すためのものではありません。_strncpy_l and _wcsncpy_l have no locale dependence; they are provided just for _tcsncpy_l and are not intended to be called directly.

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
strncpystrncpy <string.h><string.h>
wcsncpywcsncpy <string.h> または <wchar.h><string.h> or <wchar.h>
_mbsncpy_mbsncpy_l_mbsncpy, _mbsncpy_l <mbstring.h><mbstring.h>

プラットフォーム互換性の詳細については、「互換性」をご覧ください。For additional platform compatibility information, see Compatibility.

Example

次の例では、 strncpyの使用方法と、プログラムのバグやセキュリティ上の問題を発生させるために使用方法を誤用する方法を示します。The following example demonstrates the use of strncpy and how it can be misused to cause program bugs and security issues. コンパイラは、 crt_strncpy_x86 (15) のようなstrncpyへの呼び出しごとに警告を生成します。警告 C4996: ' strncpy ':この関数または変数は安全でない可能性があります。代わりに strncpy_s の使用を検討してください。使用されなくなったことの警告を無効にするには、_CRT_SECURE_NO_WARNINGS を使用します。詳しくは、オンライン ヘルプをご覧ください。The compiler generates a warning for each call to strncpy similar to crt_strncpy_x86.c(15) : warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

// crt_strncpy_x86.c
// Use this command in an x86 developer command prompt to compile:
// cl /TC /W3 crt_strncpy_x86.c

#include <stdio.h>
#include <string.h>

int main() {
   char t[20];
   char s[20];
   char *p = 0, *q = 0;

   strcpy_s(s, sizeof(s), "AA BB CC");
   // Note: strncpy is deprecated; consider using strncpy_s instead
   strncpy(s, "aa", 2);     // "aa BB CC"         C4996
   strncpy(s + 3, "bb", 2); // "aa bb CC"         C4996
   strncpy(s, "ZZ", 3);     // "ZZ",              C4996
                            // count greater than strSource, null added
   printf("%s\n", s);

   strcpy_s(s, sizeof(s), "AA BB CC");
   p = strstr(s, "BB");
   q = strstr(s, "CC");
   strncpy(s, "aa", p - s - 1);   // "aa BB CC"   C4996
   strncpy(p, "bb", q - p - 1);   // "aa bb CC"   C4996
   strncpy(q, "cc",  q - s);      // "aa bb cc"   C4996
   strncpy(q, "dd", strlen(q));   // "aa bb dd"   C4996
   printf("%s\n", s);

   // some problems with strncpy
   strcpy_s(s, sizeof(s), "test");
   strncpy(t, "this is a very long string", 20 ); // C4996
   // Danger: at this point, t has no terminating null,
   // so the printf continues until it runs into one.
   // In this case, it will print "this is a very long test"
   printf("%s\n", t);

   strcpy_s(t, sizeof(t), "dogs like cats");
   printf("%s\n", t);

   strncpy(t + 10, "to chase cars.", 14); // C4996
   printf("%s\n", t);

   // strncpy has caused a buffer overrun and corrupted string s
   printf("Buffer overrun: s = '%s' (should be 'test')\n", s);
   // Since the stack grows from higher to lower addresses, buffer
   // overruns can corrupt function return addresses on the stack,
   // which can be exploited to run arbitrary code.
}

OutputOutput

ZZ
aa bb dd
this is a very long test
dogs like cats
dogs like to chase cars.
Buffer overrun: s = 'ars.' (should be 'test')

自動変数のレイアウトや、エラー検出とコード保護のレベルは、コンパイラの設定を変更すると変わることがあります。The layout of automatic variables and the level of error detection and code protection can vary with changed compiler settings. この例は、他のコンパイル環境で、または他のコンパイラ オプションを指定してビルドすると、出力の結果が異なることがあります。This example may have different results when built in other compilation environments or with other compiler options.

関連項目See also

文字列操作String Manipulation
ロケールLocale
マルチバイト文字のシーケンスの解釈Interpretation of Multibyte-Character Sequences
_mbsnbcpy、_mbsnbcpy_l_mbsnbcpy, _mbsnbcpy_l
strcat、wcscat、_mbscatstrcat, wcscat, _mbscat
strcmp、wcscmp、_mbscmpstrcmp, wcscmp, _mbscmp
strcpy、wcscpy、_mbscpystrcpy, wcscpy, _mbscpy
strncat、_strncat_l、wcsncat、_wcsncat_l、_mbsncat、_mbsncat_lstrncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l
strncmp、wcsncmp、_mbsncmp、_mbsncmp_lstrncmp, wcsncmp, _mbsncmp, _mbsncmp_l
_strnicmp、_wcsnicmp、_mbsnicmp、_strnicmp_l、_wcsnicmp_l、_mbsnicmp_l_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr、wcsrchr、_mbsrchr、_mbsrchr_lstrrchr, wcsrchr, _mbsrchr, _mbsrchr_l
_strset、_strset_l、_wcsset、_wcsset_l、_mbsset、_mbsset_l_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l
strspn、wcsspn、_mbsspn、_mbsspn_lstrspn, wcsspn, _mbsspn, _mbsspn_l
strncpy_s、_strncpy_s_l、wcsncpy_s、_wcsncpy_s_l、_mbsncpy_s、_mbsncpy_s_lstrncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l
strcpy_s、wcscpy_s、_mbscpy_sstrcpy_s, wcscpy_s, _mbscpy_s