[function] strlcpy(), strlcat()

duckkuri·2020년 10월 6일
0

libc_functions

목록 보기
10/22

[function] strlcpy(), strlcat()

라이브러리 : libc

헤더 : string.h

  • 크기 제한 문자열 복사 및 연결

  • 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의 글자 수를 가진다.
  • 리턴값이 distsize보다 크거나 같으면, 잘려버린 문자열을 출력한다. 이를 처리하는건 호출자의 책임이다.

테스트 예제

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

profile
😤 Today I Learned

1개의 댓글

comment-user-thumbnail
2021년 1월 6일

strlcat 테스트 예제 주석을 보면
[return (5+11) : 16, dst(goodssays) : goodssays] 이렇게 되어있는데,
세번째 인자값이 9로 줘서, 마지막 null값을 보장하면 'goodssay'로 출력될 것 같아요.

답글 달기