[C]strncpy & strlcpy
strncpy함수와 strlcpy함수 모두 문자열(dst)에 원하는 길이만큼 소스(src)를 복사하는 함수입니다.
1️⃣ 함수원형
< strncpy >
char *strncpy(char *dst, const char *src, size_t len)
< strlcpy >
size_t strlcpy(char *dst, const char *src, size_t len)
2️⃣ 헤더파일, 반환값
- 반환값 :
- strncpy: 복사된 문자열(char*)
- strlcpy: src문자열의 길이(size_t)
- 헤더파일 : <string.h>
3️⃣ 함수구현
< strncpy >
char* strncpy(char *dst, const char *src, size_t len)
{
char *temp;
temp = dst;
while (len-- > 0 && *src != '\0')
*temp++ = *src++;
if (len-- > 0)
*temp++ = '\0';
return (dst);
}
< strlcpy >
size_t strlcpy(char *dst, const char *src, size_t len)
{
size_t src_len;
size_t i;
i = 0;
while (src[src_len])
src_len++;
while (i < src_len && i < len - 1)
{
dst[i] = src[i];
i++;
}
if (len > 0)
dest[i] = '\0';
return (src_len);
}
4️⃣ 특징 & 주의사항
strncpy | strlcpy | |
---|---|---|
반환값 | 복사된 문자열 | src(복사할문자열)의 길이 |
끝처리 | src가 len보다 짧거나 같으면 남은 자리를 ‘\0’으로 체워줌 | len의 크기가 0보다 클경우 끝의 한자리만 ‘\0’으로 채워줌 |
src > len일 경우 | NULL문자(‘\0’)를 붙일 곳이 없음 따라서 안붙여줌 | len의길이가 0보다 크기만하면 끝자리에 무조건 NULL문자를 붙여준다. |
- strncpy함수 같은경우 src가 len의 길이보다 크게되면 문자열 끝에 ‘\0’문자를 붙여주지 않기 때문에 위험해질 수 있습니다.
그래서 다음과 같은 코드와 같이 사용된다고 합니다.strncpy(dest, src, DEST_LEN); /* DEST_LEN: 6 */ dest[DEST_LEN - 1] = '\0'; /* 추가된 코드 */
strlcpy함수 같은 경우 위의 strncpy의 단점을 보완한 상태로 조금 더 안전한 함수입니다.
운영체제나 콘솔프로그램에 따라 <string.h> 헤더에 정의되어 있지 않을 경우 직접 구현해서 사용하던가 strncpy함수에 위와같은 코드를 추가해서 사용하면될 것 같습니다.- 자료형이 size_t인 len의 값이 음수가 되면 버퍼오버플로우(size_t는 unsigned형으로 선언되어 있기 때문)가 일어납니다. 컴파일러에 따라서 경고메시지를 출력해주기도 합니다. 대부분 컴파일러에서 abort오류가 일어납니다.