크기 제한 문자열 복사 및 연결
strlcpy()와 strlcat()함수는 sprintf() 처럼 복사와 문자열 연결을 입력한 파라미터와 같은 결과를 내보낸다.
strlcpy()와 strlcat()함수는 실수하지 않도록 안전하고 오류발생률이 낮도록 철저히 디자인 되었다.
strlcpy()와 strlcat()함수는 목적지 버퍼의 전체 크기를 차지하고 공간이 있는 경우 NULL종료가 된도록 보증한다.
strlcpy()는 dstsize가 0이 아닌경우 (dstsize - 1)만큼의 문자를 src에서 dst로 복사후 NULL-종료한다.
strlcat()는 dst끝에 src문자를 덧붙힌다. 최대 (dstsize - strlen(dst) - 1)만큼의 문자열이 덧붙혀진다.
dstsize가 0 또는 본래 dst 문자열보다 dstsize가 큰 경우 NULL 종료한다. (실제로 이것은 dstsize와 dst문자열이 올바르지 않음을 의미하기 때문에 일어나선 안되는 일이다.)
만약 src와 dst 문자열이 겹치는 경우 동작이 정의되지 않는다.
strlcpy(char *retrict_dst, const char * retrict_src, size_t dst_size);
strlcat(char *retrict_dst, const char * retrict_src, size_t dst_size);
char retrict_dst : 제한된 도착 문자열
const char retrict_src : 제한된 상수 출발 문자열
size_t dist_size : 도착 크기
size_t dist_size : 도착 크기
size_t : 가장 큰사이즈를 담을 수 있는 unsigned 데이터 타입. int, unsigned int로 대체 가능
const : 불변의 변수
int 형 데이터로 리턴
snprintf()는 일부 시스템에서 완전히 안전하지 않음) n = strlcpy(dst, src, len);
n = snprintf(dst, len, "%s", src);
snprintf()와 같이 strlcpy()와 strlcat() 함수는 함수가 생성한 문자열의 총 길이를 반환한다. strlcpy()는 src의 총 길이를 의미한다.strlcat()는 가진 dst의 초기 글자 수 + src의 글자 수를 가진다.char src[] = "hello";
char dst[] = "goods";
printf("return (5) : %ld, dst(he) : %s\n", strlcpy(dst,src,3), dst); // return (5) : 5, dst(he) : he
char src[] = "saysomthing";
char dst[10] = "goods";
printf("return (5+11) : %d, dst(goodssay) : %s\n", strlcat(dst,src,9), dst); // return (5+11) : 16, dst(goodssays) : goodssays
참고 사이트
https://www.freebsd.org/cgi/man.cgi?query=index&sektion=3&apropos=0&manpath=fre
blogId=rlackd93&logNo=221326192418&categoryNo=12&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=search
strlcat 테스트 예제 주석을 보면
[return (5+11) : 16, dst(goodssays) : goodssays] 이렇게 되어있는데,
세번째 인자값이 9로 줘서, 마지막 null값을 보장하면 'goodssay'로 출력될 것 같아요.