strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l
한 문자열의 문자를 복사 합니다.보다 안전한 버전의이 함수를 사용할 수 있습니다. see 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 함수 복사 초기 count 자 strSource 에 strDest 및 반환 strDest.경우 count 의 길이 보다 작거나 strSource, null 문자가 복사 된 문자열을 자동으로 추가 되지 않습니다.경우 count 의 길이 보다 큰 경우 strSource, 대상 문자열에 null 문자 길이까지 채운 count.동작을 strncpy 원본 및 대상 문자열 겹칠 경우 정의 되어 있지 않습니다.
보안 정보 |
---|
strncpy충분 한 공간을 확인 하지 않습니다 strDest. 이렇게 하면 잠재적인 버퍼 오버런 원인이 있습니다.count 인수 제한 문자 복사. 크기에 제한이 없는 strDest.다음 예제를 참조하십시오.자세한 내용은 버퍼 오버런 방지. |
경우 strDest 또는 strSource 되는 NULL 포인터를 경우 count 보다 작거나 0에 잘못 된 매개 변수 처리기의 설명에 따라 호출 됩니다 매개 변수 유효성 검사.이러한 함수 실행을 계속 허용 되 면-1을 반환 하 고 설정 errno 에EINVAL
wcsncpy및 _mbsncpy 와이드 및 멀티 바이트 문자 버전의 strncpy.인수 및 반환 값을 wcsncpy 및 _mbsncpy 에 따라 달라 집니다.이러한 6 개의 함수 그렇지에 동일 하 게 동작 합니다.
이러한 함수 버전의 _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 및 잘못 어떻게 프로그램 버그 및 보안 문제를 일으키는 것으로 사용 될 수 있습니다.각 호출에 대해 경고를 생성 하는 컴파일러 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.
// 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 항목
참고 항목
참조
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