C - <string.h> - strcat strncat, strlcat 구현하기

skyju·2022년 2월 9일
0

C

목록 보기
3/5

char *strcat(char *destination, char * source)
destination에 source를 이어 붙여준다.
종료 처리
다 이어붙이고 난 뒤, 마지막에 종료문자를 붙여주면 된다.
반환 값
변경 된 destination을 반환한다.

int	cal_str_length(char *str)
{
	int	count;
	count = 0;
	while (*(str + count))
		++count;
	return (count);
}

char	*reproduce_strcat(char *dest, char *src)
{
	int	dest_length;
	int	src_i;
	dest_length = cal_str_length(dest);
	src_i = 0;
	while (*(src + src_i))
	{
		*(dest + dest_length) = *(src + src_i);
		++dest_length;
		++src_i;
	}
	*(dest + dest_length) = '\0';
	return (dest);
}

char *strncat(char *destination, char * source, unsigned int size)
strncat에서 size는 size만큼 이어 붙이겠다는 뜻이다.
종료 처리
size만큼 이어 붙인 후 종료문자를 붙여준다.
반환 값
변경 된 destination을 반환한다.

unsigned int	cal_str_length(char *str)
{
	unsigned int	count;
	count = 0;
	while (*(str + count))
		++count;
	return (count);
}

char	*reproduce_strncat(char *dest, char *src, unsigned int nb)
{
	unsigned int	dest_length;
	unsigned int	src_i;
	dest_length = cal_str_length(dest);
	src_i = 0;
	while (*(src + src_i) && src_i < nb)
	{
		*(dest + dest_length) = *(src + src_i);
		++dest_length;
		++src_i;
	}
	*(dest + dest_length) = '\0';
	return (dest);
}

unsigned int *strlcat(char *destination, char * source, unsigned int size)
strlcat의 경우 만들고 싶은 총 문자열의 길이를 반환하는 특징을 가지고 있다.
이 때의 size의 경우 strncat과 달리 만들고 싶은 총 문자열의 길이를 의미한다.
이 때 overflow를 잘 유의하며 구현해야 한다. (l~ 함수의 경우 overflow에 잘 대응이 되는 함수이기 때문에)
즉, 정리하여 말하자면 source의 길이에 destination length와 size중에 더 작은 것을 더하여 반환한다고 할 수 있다.
종료 처리
복사를 다 완료한 후 종료문자를 붙여준다.
반환 값
반환은 두 가지 경우로 나뉜다.
(1) destination이 이미 목표 size 값 보다 큰 경우 : source의 길이에 size를 합쳐서 반환한다.
(2) destination보다 큰 size 값이 들어올 경우 : destination의 길이와 source의 길이를 합친 총 length를 반환한다.

unsigned int	cal_str_length(char *str)
{
	unsigned int	count;
	count = 0;
	while (*(str + count))
		++count;
	return (count);
}

unsigned int	reproduce_strlcat(char *dest, char *src, unsigned int size)
{
	unsigned int	dest_length;
	unsigned int	src_length;
	unsigned int	index;
	dest_length = cal_str_length(dest);
	src_length = cal_str_length(src);
	index = 0;
	while (*(src + index) && dest_length + index + 1 < size)
	{
		*(dest + dest_length + index) = *(src + index);
		++index;
	}
	*(dest + dest_length + index) = '\0';
	if (size < dest_length)
		return (src_length + size);
	return (src_length + dest_length);
}


>***man strlcpy***
~~~
Besides quibbles over the return type (size_t versus int) and signal handler safety (snprintf(3) is not entirely safe on some systems), the following two are equivalent:
n = strlcpy(dst, src, len);
n = snprintf(dst, len, "%s", src);
Like snprintf(3), the strlcpy() and strlcat() functions return the total length of the string they tried to create. 
For strlcpy() that means the length of src. 
For strlcat() that means the initial length of dst plus the length of src.
If the return value is >= dstsize, the output string has been truncated.
It is the caller's responsibility to handle this.
~~~
strlcpy()와 strlcat() 함수는 그들이 만들려고 노력했던 문자열의 총 길이를 리턴한다. 
즉, strlcpy의 경우 원본 문자열 길이, strlcat의 경우 dest+src 문자열 길이이다.
~~~
size_t	strlcat(char * restrict dst, const char * restrict src, size_t dstsize);
strlcat() appends string src to the end of dst.  It will append at most dstsize - strlen(dst) - 1 characters.
It will then NUL-terminate, unless dstsize is 0 or the original dst string was longer than dstsize (in practice this should not happen as it means that either dstsize is incorrect or that dst is not a proper string).
~~~
strcat()은 데스티네이션의 끝에 원본 문자열을 붙여준다.
dstsize가 0이거나 데스티네이션 문자열이 dstsize보다(물론 이경우엔 잘못된 값이 들어간 것임) 크면 null을 리턴한다.
     
     
profile
https://github.com/skyju

0개의 댓글