크기 제한 문자열 복사 및 연결
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'로 출력될 것 같아요.