함수 원형
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은 변하지 않으므로 예외처리 하지 않고 그대로 진행하였다.