[C] strcpy, strncpy, strlcpy 차이점

숭글·2022년 4월 18일
1

In manual.

#include <string.h>

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

The strcpy() function copies the string pointed to by src,
including the terminating null byte ('\0'), to the buffer pointed to by dest. The strings may not overlap, and the destination string dest must be large enough to receive the copy. Beware of buffer overruns!

src의 내용을 dest에 복사한다. dest의 크기가 src보다 작지않은 이상은 정상적으로 원하는 결과를 얻을 수 있다!
dest의 크기가 충분하지 않으면 '\0'이 복사되지 않아 끝나지않는 문자열을 만들 수 있으므로 주의해야한다.

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

The strncpy() function is similar, except that at most n bytes of src are copied. Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated.

src의 내용을 dest에 size n만큼 복사한다. 여기서 size n은 dest의 size를 의미한다. 대부분 사용할 때 strncpy(dest, src, sizeof(dest) / 4); 로 사용할 것이다.
단점은 src의 크기가 n보다 작은 경우 dest에는 문자열의 끝을 알리는 '\0' 문자가 복사되지 못하여 dest가 끝나지 않게된다. 이런 경우 dest를 출력해봤을때 우연히 '\0'를 만나기 전까지 쓰레기값이 줄줄이 출력되는 결과를 만날 것임... dest를 잘못 참조하다보면 segfalut가 생길 수도 있고 다른 코드를 망칠 수도 있어서 사용에 유의해야한다.

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

The strlcpy() function copies up to size - 1 characters from the NUL-terminated string src to dst, NUL-terminating the result.

non-terminate 문제를 보완한 함수다. dest의 size가 충분하지 않거나, 명시해준 size보다 src가 커서 dest에 '\0'가 포함되지 않는 경우를 없앨 수 있다.
매뉴얼의 설명처럼 strlcpy는 dest의 마지막에는 꼭 '\0'이 존재하기 때문에 size - 1만큼의 문자를 복사한다.
만약 src가 "hello" 라는 값을 가진 문자열이고 dest의 size가 5라면 dest에는 "hell"라는 문자열이 '\0'과 함께 저장된다.
strcpy, strncpy와 다르게 int값이 반환되는데 반환값은 src의 length이다. 구현하기 위해선 dest의 size와 별개로 str의 length를 따로 구해야했다.


I implemented the 3 functions.
It was needed to read manual carefully for exactly same operation.
they are similar but slightly different to enough to be forgoten easliy.
this is my note about i learned about them.

profile
Hi!😁 I'm Soongle. Welcome to my Velog!!!

1개의 댓글

comment-user-thumbnail
2022년 9월 27일

단점은 src의 크기가 n보다 작은 경우 ----> 단점은 src의 크기가 n보다 큰경우
로 수정하는게 맞는것 같습니다.

답글 달기