다음을 통해 공유


strcpy_s, wcscpy_s, _mbscpy_s_mbscpy_s_l

문자열을 복사합니다. 이러한 버전의 경우 wcscpy_mbscpyCRTstrcpy보안 기능에 설명된 대로 보안 기능이 향상되었습니다.

Important

Windows 런타임에서 실행되는 애플리케이션에서는 _mbscpy_s_mbscpy_s_l을 사용할 수는 없습니다. 자세한 내용은 유니버설 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
대상 문자열 버퍼의 크기로, 내로(narrow) 함수와 멀티바이트 함수의 경우 char 단위이고 와이드(wide) 함수의 경우 wchar_t 단위입니다. 이 값은 0보다 크고 0보다 RSIZE_MAX크지 않아야 합니다. 이 크기가 문자열 다음의 종료를 차지하는지 확인합니다 NULL .

src
null 종료 소스 문자열 버퍼입니다.

locale
사용할 로캘입니다.

반환 값

성공하면 0이고, 실패하면 오류입니다.

오류 조건

dest dest_size src 반환 값 dest의 내용
NULL any any EINVAL 수정 안 됨
any any NULL EINVAL dest[0]을 0으로 설정
any 0 또는 너무 작음 any ERANGE dest[0]을 0으로 설정

설명

strcpy_s 함수는 null 종결 문자를 포함하여 src의 주소 내용을 dest에서 지정하는 위치로 복사합니다. 대상 문자열은 소스 문자열 및 이 문자열의 null 종결 문자를 포함할 만큼 충분히 커야 합니다. 소스 문자열과 대상 문자열이 겹치는 경우 strcpy_s의 동작이 정의되지 않습니다.

wcscpy_s는 와이드 문자 버전의 strcpy_s이고, _mbscpy_s는 멀티바이트 문자 버전입니다. 인수 wcscpy_s 는 와이드 문자열입니다. _mbscpy_s 인수이며 _mbscpy_s_l 멀티바이트 문자열입니다. 그 외의 경우에는 이들 함수가 동일하게 작동합니다. _mbscpy_s_l 는 현재 로 _mbscpy_s 캘 대신 전달된 로캘 매개 변수를 사용한다는 점을 제외하고 동일합니다. 자세한 내용은 locale를 참조하세요.

dest null 포인터이거나 src 대상 문자열 크기 dest_size 가 너무 작은 경우 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기가 호출됩니다. 계속해서 실행하도록 허용된 경우, 이러한 함수는 EINVAL을 반환하고 errnoEINVAL로 설정(dest 또는 src가 null 포인터일 때)하며 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 전용입니다. 호환성에 대한 자세한 내용은 호환성을 참조하세요.

예시

프로덕션 품질 코드와 달리 이 샘플은 오류를 확인하지 않고 보안 문자열 함수를 호출합니다.

// 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!

참고 항목

문자열 조작
strcat, wcscat, _mbscat_mbscat_l
strcmp, wcscmp, _mbscmp_mbscmp_l
strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s_mbsncat_s_l
strncmp, wcsncmp, _mbsncmp_mbsncmp_l
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s_mbsncpy_s_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l_mbsnicmp_l
strrchr, wcsrchr, _mbsrchr_mbsrchr_l
strspn, wcsspn, _mbsspn_mbsspn_l