次の方法で共有


strcpy_swcscpy_s_mbscpy_s_mbscpy_s_l

文字列をコピーします。 これらのバージョンの strcpywcscpy_mbscpy には、CRT の セキュリティ機能の説明に従ってセキュリティが強化

重要

_mbscpy_s および _mbscpy_s_l は、Windows ランタイムで実行するアプリケーションでは使用できません。 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。

構文

errno_t strcpy_s(
   char *dest,
   rsize_t dest_size,
   const char *src
);
errno_t wcscpy_s(
   wchar_t *dest,
   rsize_t dest_size,
   const wchar_t *src
);
errno_t _mbscpy_s(
   unsigned char *dest,
   rsize_t dest_size,
   const unsigned char *src
);
errno_t _mbscpy_s_l(
   unsigned char *dest,
   rsize_t dest_size,
   const unsigned char *src,
   _locale_t locale
);
// Template functions are C++ only:
template <size_t size>
errno_t strcpy_s(
   char (&dest)[size],
   const char *src
); // C++ only
template <size_t size>
errno_t wcscpy_s(
   wchar_t (&dest)[size],
   const wchar_t *src
); // C++ only
template <size_t size>
errno_t _mbscpy_s(
   unsigned char (&dest)[size],
   const unsigned char *src
); // C++ only
template <size_t size>
errno_t _mbscpy_s_l(
   unsigned char (&dest)[size],
   const unsigned char *src,
   _locale_t locale
); // C++ only

パラメーター

dest
追加先の文字列バッファーの場所。

dest_size
ナロー関数とマルチバイト関数の場合は、コピー先の文字列バッファーの char 単位のサイズ、ワイド関数の場合は wchar_t 単位のサイズ。 この値は 0 より大きく、RSIZE_MAX より大きくない必要があります。 このサイズに、文字列の後に続く終端の NULL を含めるようにします。

src
null で終わる元の文字列バッファー。

locale
使用するロケール。

戻り値

正常に終了した場合は 0 を返し、それ以外の場合はエラーを返します。

エラー条件

dest dest_size src 戻り値 dest の内容
NULL 任意 任意 EINVAL 変更されない
任意 任意 NULL EINVAL 0 に設定された dest[0]
任意 0 または小さすぎる 任意 ERANGE 0 に設定された dest[0]

解説

strcpy_s 関数は、src のアドレスの内容を、終端の NULL 文字も含めて、dest で指定された場所にコピーします。 コピー先の文字列には、コピー元の文字列とその終端の NULL 文字を保持できるサイズが必要です。 コピー元とコピー先の文字列が重なり合っている場合の strcpy_s 関数の動作は未定義です。

wcscpy_sstrcpy_s のワイド文字バージョンであり、_mbscpy_s はマルチバイト文字バージョンです。 wcscpy_sの引数はワイド文字列です。 _mbscpy_s_mbscpy_s_lの引数はマルチバイト文字列です。 それ以外では、これらの関数の動作は同じです。 _mbscpy_s_l は、現在のロケールの代わりに、渡されたロケール パラメーターを使用する点を除き、_mbscpy_s と同じです。 詳細については、localeを参照してください。

destまたはsrcが null ポインターの場合、またはコピー先の文字列サイズdest_sizeが小さすぎる場合は、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、EINVAL または errno が NULL ポインターならば、これらの関数は EINVAL を返し、destsrc に設定します。コピー先の文字列が小さすぎると、ERANGE を返し、errnoERANGE に設定します。

正常に実行されると、コピー先の文字列は常に NULL で終わります。

C++ では、これらの関数の使用は、バッファー長を自動的に推論できるテンプレート オーバーロードによって簡略化されるため、サイズ引数を指定する必要はありません。 また、古くて安全性の低い関数を、より新しい、より安全な関数に自動的に置き換えることができます。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。

これらの関数のデバッグ ライブラリ バージョンでは、最初にバッファーを 0xFE で埋めます。 この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。

汎用テキスト ルーチンのマップ

TCHAR.H ルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tcscpy_s strcpy_s _mbscpy_s wcscpy_s

要件

ルーチンによって返される値 必須ヘッダー
strcpy_s <string.h>
wcscpy_s <string.h> または <wchar.h>
_mbscpy_s <mbstring.h>

これらの関数は Microsoft 固有です。 互換性の詳細については、「 Compatibility」を参照してください。

運用品質コードとは異なり、このサンプルでは、エラーをチェックせずに、セキュリティで保護された文字列関数を呼び出します。

// crt_strcpy_s.c
// Compile by using: cl /W4 crt_strcpy_s.c
// This program uses strcpy_s and strcat_s
// to build a phrase.

#include <string.h>     // for strcpy_s, strcat_s
#include <stdlib.h>     // for _countof
#include <stdio.h>      // for printf
#include <errno.h>      // for return values

int main(void)
{
    char stringBuffer[80];

    strcpy_s(stringBuffer, _countof(stringBuffer), "Hello world from ");
    strcat_s(stringBuffer, _countof(stringBuffer), "strcpy_s ");
    strcat_s(stringBuffer, _countof(stringBuffer), "and ");
    strcat_s(stringBuffer, _countof(stringBuffer), "strcat_s!");

    printf("stringBuffer = %s\n", stringBuffer);
}
stringBuffer = Hello world from strcpy_s and strcat_s!

C++ コードをビルドする場合は、テンプレートのバージョンを使用する方が簡単な場合があります。

// crt_wcscpy_s.cpp
// Compile by using: cl /EHsc /W4 crt_wcscpy_s.cpp
// This program uses wcscpy_s and wcscat_s
// to build a phrase.

#include <cstring>  // for wcscpy_s, wcscat_s
#include <cstdlib>  // for _countof
#include <iostream> // for cout, includes <cstdlib>, <cstring>
#include <errno.h>  // for return values

int main(void)
{
    wchar_t stringBuffer[80];
    // using template versions of wcscpy_s and wcscat_s:
    wcscpy_s(stringBuffer, L"Hello world from ");
    wcscat_s(stringBuffer, L"wcscpy_s ");
    wcscat_s(stringBuffer, L"and ");
    // of course we can supply the size explicitly if we want to:
    wcscat_s(stringBuffer, _countof(stringBuffer), L"wcscat_s!");

    std::wcout << L"stringBuffer = " << stringBuffer << std::endl;
}
stringBuffer = Hello world from wcscpy_s and wcscat_s!

関連項目

文字列操作
strcatwcscat_mbscat_mbscat_l
strcmpwcscmp_mbscmp_mbscmp_l
strncat_s_strncat_s_lwcsncat_s_wcsncat_s_l_mbsncat_s_mbsncat_s_l
strncmpwcsncmp_mbsncmp_mbsncmp_l
strncpy_s_strncpy_s_lwcsncpy_s_wcsncpy_s_l_mbsncpy_s_mbsncpy_s_l
_strnicmp_wcsnicmp_mbsnicmp_strnicmp_l_wcsnicmp_l_mbsnicmp_l
strrchrwcsrchr_mbsrchr_mbsrchr_l
strspnwcsspn_mbsspn_mbsspn_l