다음을 통해 공유


strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

한 문자열의 문자를 다른 위치로 복사합니다. 이러한 기능의 더 안전한 버전을 사용할 수 있습니다. strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l를 참조하십시오.

중요

_mbsncpy 와 _mbsncpy_l 는 Windows 런타임에 실행되는 응용 프로그램에서 사용할 수 없습니다.자세한 내용은 /ZW에서 지원하지 않는 CRT 함수를 참조하십시오.

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

매개 변수

  • strDest
    대상 문자열입니다.

  • strSource
    소스 문자열입니다.

  • count
    복사될 문자 수입니다.

  • locale
    사용할 로캘입니다.

반환 값

strDest를 반환합니다. 반환 값 없음은 오류를 나타내는 데 예약되어 있습니다.

설명

strncpy 함수는 strDest 로 strSource 의 초기 count 문자들을 복사하고 strDest 를 반환합니다. 만일 count 이 strSource 의 길이보다 적거나 같은 경우, null문자는 복사된 문자열에 자동적으로 추가되지 않습니다. count 가 strSource 의 길이보다 크다면, 대상 문자는 count 길이까지 null 문자들을 사용하여 채워집니다. 원본 영역과 대상 문자열이 겹치면 strncpy 동작이 지정되지 않습니다.

보안 정보보안 정보

strncpy 은 strDest 의 충분한 공간을 확인하지 않습니다; 이것은 버퍼 오버런의 잠재적인 원인을 만듭니다.count 인수는 복사된 문자들의 숫자를 제한합니다; 이것은 strDest 의 크기를 제한하지 않습니다.다음 예제를 참조하십시오.자세한 내용은 버퍼 오버런 방지를 참조하십시오.

만일 strDest 또는 strSource 가 NULL 포인터이거나 count 가 0보다 적거나 같은 경우, 매개 변수 유효성 검사 에 설명된 대로 잘못된 매개변수 처리기가 호출됩니다. 계속해서 실행하도록 허용된 경우, 이러한 함수는 -1을 반환하고 errno를 EINVAL로 설정합니다.

wcsncpy 및 _mbsncpy 는 와이드 문자 및 strncpy의 멀티 바이트 문자 버전입니다. 인수와 wcsncpy 의 반환값과 _mbsncpy 에 따라 달라집니다. 그렇지 않으면 이들 여섯 함수는 동일하게 작동합니다.

_l 접미사가 있는 이러한 함수 버전은 로캘 종속 동작에 현재 로캘 대신 전달된 로캘 매개 변수를 사용하는 경우를 제외하고는 동일합니다. 자세한 내용은 로캘을 참조하십시오.

C++에서 이러한 함수는 보다 최신의 보안 대응 함수를 호출하는 템플릿 오버로드를 갖고 있습니다. 자세한 내용은 안전한 템플릿 오버로드을 참조하십시오.

제네릭 텍스트 라우팅 매핑

TCHAR.H 루틴

_UNICODE &및 _MBCS 정의되지 않음

_MBCS 정의됨

_UNICODE 정의됨

_tcsncpy

strncpy

_mbsnbcpy

wcsncpy

_tcsncpy_l

_strncpy_l

_mbsnbcpy_l

_wcsncpy_l

참고

_strncpy_l 및 _wcsncpy_l 는 로캘 종속 하지않고 _tcsncpy_l 에 대해 제공되고 직접 호출될 수 없습니다.

요구 사항

루틴

필수 헤더

strncpy

<string.h>

wcsncpy

<string.h> 또는 <wchar.h>

_mbsncpy, _mbsncpy_l

<mbstring.h>

추가적 플랫폼 호환성 정보에 대해서는, 호환성을 참고하세요.

예제

다음 예제에서는 strncpy 의 사용과 프로그램 버그와 보안 문제를 야기하는데 악용될수 있는 부분에 대해 설명합니다. 컴파일러는 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. 와 비슷한 strncpy 의 각 호출에 대한 경고를 생성합니다.

// 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.
}

Output

  

자동 변수의 레이아웃과 오류 감지 및 코드 보호의 수준은 컴파일러의 설정에 따라 달라질 수 있습니다. 이 예제에서는 다른 컴파일 옵션을 사용하거나 다른 컴파일 환경에서 빌드하는 경우 서로 다른 결과가 있을 수 있습니다.

해당 .NET Framework 항목

System::String::Copy

참고 항목

참조

문자열 조작(CRT)

로캘

멀티바이트 문자 시퀀스 해석

_mbsnbcpy, _mbsnbcpy_l

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strcpy_s, wcscpy_s, _mbscpy_s