이름

strcpy, strncpy – 문자열 복사하기

개요

#include < string.h >

char * strcpy (char * dest , const char * src );

char * strncpy (char * dest , const char * src , size_t n );

기술

strcpy () 함수는 dest가 가리키는 버퍼에 종료 null 바이트 ( ‘\ 0’)를 포함하여 src가 가리키는 문자열을 복사합니다. 문자열은 겹치지 않을 수 있으며 대상 문자열 dest 는 사본을 수신 할만큼 충분히 커야합니다. 버퍼 오버런에주의하십시오!(버그를 참조하십시오.)

strncpy () 함수는 비슷하게 비슷하지만, src의 기껏해야 n 바이트 만 복사됩니다. 경고 : src 의 첫 번째 n 바이트 사이에 null 바이트가 없으면 dest에 배치 된 문자열은 null로 종료되지 않습니다.

src 의 길이가 n 보다 작은 경우 strncpy ()는 총 n 바이트가 기록되도록 dest 에 추가 null 바이트를 씁니다.

strncpy ()의 간단한 구현은 다음과 같습니다.

char *
strncpy (char * dest, const char * src, size_t n)
{
size_t i;

for (i = 0; i dest [i] = src [i];
for (; i <n; i ++)
dest [i] = ‘\ 0’;

목적지를 되돌려 라.
}

반환 값

strcpy () 및 strncpy () 함수는 대상 문자열 dest에 대한 포인터를 반환합니다.

준수

SVr4, 4.3BSD, C89, C99.

노트

일부 프로그래머는 strncpy ()가 비효율적이고 오류가 발생하기 쉽다고 생각합니다. 프로그래머가 dest 의 크기가 src의 길이보다 크다는 것을 안다면 (즉, 테스트 할 코드 포함), strcpy ()를 사용할 수 있습니다.

strncpy ()의 한 가지 유효한 (의도 된) 사용은 고정 길이 버퍼에 C 문자열을 복사하면서 버퍼가 오버플로되지 않고 대상 버퍼의 사용되지 않는 바이트가 0이되도록 보장하는 것입니다 (정보 누출을 방지하기 위해 버퍼는 미디어에 쓰여지거나 프로세스 간 통신 기술을 통해 다른 프로세스로 전송되어야합니다).

src 의 첫 번째 n 바이트에 종료 null 바이트가 없으면 strncpy ()는 dest에 끝나지 않은 문자열을 생성합니다. 다음과 같이 강제 종료 할 수 있습니다.

strncpy (buf, str, n);
if (n> 0)
buf [n-1] = ‘\ 0’;

물론, 위의 기술은 src에 포함 된 정보가 dest로 복사 할 때 손실된다는 사실을 무시합니다.

일부 시스템 (BSD, Solaris 및 기타)은 다음과 같은 기능을 제공합니다.

size_t strlcpy (char * dest, const char * src, size_t size);

이 함수는 strncpy ()와 비슷하지만 크기 1 바이트를 dest에 복사하고 항상 종료 null 바이트를 추가하며 대상을 (추가) null 바이트로 채우지 않습니다. 이 함수는 strcpy ()와 strncpy ()의 몇 가지 문제점을 수정하지만 크기 가 너무 작 으면 호출자는 여전히 데이터 손실 가능성을 처리해야합니다. 함수의 반환 값은 src 의 길이로, 잘림을 쉽게 감지 할 수 있습니다. 반환 값이 크기 보다 크거나 같으면 절단이 발생했습니다. 데이터 손실이 중요한 경우 호출자 호출 전에 인수를 확인하거나 함수 반환 값을 테스트해야합니다. strlcpy ()는 glibc에는 존재하지 않고 POSIX에 의해 표준화되지도 않았지만, libbsd 라이브러리를 통해 리눅스에서 사용 가능합니다.

버그

strcpy ()의 대상 문자열이 충분히 크지 않다면 아무 일도 일어나지 않을 것입니다. 오버플로 된 고정 길이 문자열 버퍼는 컴퓨터를 완전히 제어하는 ​​데있어 아주 좋은 기술입니다. 프로그램이 버퍼에 데이터를 읽거나 복사 할 때마다 프로그램은 먼저 충분한 공간이 있는지 확인해야합니다. 오버 플로우가 불가능하다는 것을 보여줄 수 있다면 이것은 불필요 할 수 있지만주의해야합니다. 프로그램이 시간이 지남에 따라 불가능해질 수있는 방식으로 변경 될 수 있습니다.

참고 사항

memcpy (3), memmove (3), stpcpy (3), stpduc (3), strdup (3), string (3), wcscpy (3), wcsncpy (3), bcopy

참조 인

db2x_manxml (1), feature_test_macros (7), fmt_strn (3), strcat (3), strl (3), strlcpy (3), strxfrm