함수 만들기 - ft_strlcat

nhwang·2021년 12월 9일
0

함수 원형

t_size strlcat(char dst, const char src, t_size size)

반환값
dst > size : size + len(src) [정의이므로 그냥 따르긴 하는데 직관적인 느낌은 없음]
else : len(dst) + len(src) [두 개 문자열의 길이의 총합]

*여기서 의미하는 size는 dst+src합친 뒤의 최종 사이즈를 의미한다. 즉 size < dst인 경우 동작하지 않음.
따라서, dst > size인 경우 붙혀넣기는 일어나지 않는다

*최종적으로 null 넣어줘야함
dst를 str = "hellow" 이런식으로 주면 힘들다.
str[30]="~~~"와 같이 공간이 충분하게 주어야하고 변경가능하도록 해야함

구현

#include "libft.h"

size_t	ft_strlcat(char *dst, const char *src, size_t size)
{
	char		*stdst;
	const char	*stsrc;
	size_t		i;
	size_t		dstlen;
	size_t		srclen;

	dstlen = ft_strlen(dst);
	srclen = ft_strlen(src);
	stdst = dst;
	stsrc = src;
	i = 0;
	if (dstlen > size)
		return (size + srclen);
	while (*stdst)
		stdst++;
	while (*stsrc && dstlen + 1 + i < size)
	{
		*stdst = *stsrc;
		stdst++;
		stsrc++;
		i++;
	}
	*stdst = '\0';
	return (dstlen + srclen);
}

사용한 테크닉? : i는 언사인드이므로 음수로 쓰면 안된다.
따라서 와일문 진입에 들어갈 때 dstlen < size - 1 - i로 진입하는거보다 각 항이 +1 +i써서 언사인드 무한루프 피했음.

원래라면 dstlen == size일 경우에는 null못넣어서 바로 size+srclen을 하는데, 리턴값이 어차피 요구하는 것이 바뀌어도
srclen은 변하지 않으므로 예외처리 하지 않고 그대로 진행하였다.

profile
42Seoul

0개의 댓글