#include <stdio.h>
#include <unistd.h>

unsigned int ft_strlen(char *src)
{
	unsigned int cnt;

	cnt = 0;
	while (*src != '\\0')
	{
		src++;
		cnt++;
	}
	return (cnt);
}

unsigned int ft_strlcat(char *dest, char *src, unsigned size)
{
    char *dest2 = dest;
    unsigned int dest_len = ft_strlen(dest);
    unsigned int src_len = ft_strlen(src);
    
	while (*dest != '\\0')
	{
		dest++;
	}
    if (size >= dest_len)
	{
    	while (*src && (size--))
    	{
    		*dest = *src;
            dest++;
    		src++;
    	}
    	*dest = '\\0';
      return (dest_len + src_len);
    }
    else
    {
    	return (src_len + size);
    }
}

#include <string.h>

int main(void)
{
    char a[10] = "abcde";
    char b[] = "asdf";

    printf("%d", ft_strlcat(a, b, 11));
    //printf("%d", ft_strlcat(a, b, 3));
}

수정한 코드1

슬랙에 올라온 테스트 케이스로 테스트 해 본 결과 원래 함수의 길이보다 크게 나와서 size - 1 만큼의 길이를 제외하게 되었다. 그러니까 테스트 케이스의 값과 결과가 같았다.

#include <unistd.h>

unsigned int	ft_strlen(char *src)
{
	unsigned int	cnt;

	cnt = 0;
	while (src[cnt] != '\\0')
	{
		cnt++;
	}
	return (cnt);
}

unsigned int	ft_strlcat(char *dest, char *src, unsigned int size)
{
	unsigned int	j;
	unsigned int	dest_len;
	unsigned int	src_len;

	dest_len = ft_strlen(dest);
	src_len = ft_strlen(src);
	j = 0;
	if (size == 0)
		return (src_len);
	while ((src[j] != '\\0') && (dest_len + j < size - 1))
	{
		dest[dest_len + j] = src[j];
		j++;
	}
	dest[dest_len + j] = '\\0';
	if (dest_len < size)
		return (dest_len + src_len - (size - 1));
	return (src_len + size);
}
/*

수정한 코드 2

알고보니 테스트 케이스가 잘 못 되었던 것 같다. 데스트를 따로 선언하고 테스트를 해 보니 원래 함수와 결과값이 다르게 나왔다. 그래서 다시 수정함. 나중에 리트 때 참고할 것.

참고로 size - 1은 size가 0이거나 1일 때 오류가 발생할 수 있어서 -1을 이항시켰다.

#include <unistd.h>

unsigned int	ft_strlen(char *src)
{
	unsigned int	cnt;

	cnt = 0;
	while (src[cnt] != '\\0')
	{
		cnt++;
	}
	return (cnt);
}

unsigned int	ft_strlcat(char *dest, char *src, unsigned int size)
{
	unsigned int	j;
	unsigned int	dest_len;
	unsigned int	src_len;

	dest_len = ft_strlen(dest);
	src_len = ft_strlen(src);
	j = 0;
	if (size == 0)
		return (src_len);
	while ((src[j] != '\\0') && (dest_len + j + 1 < size))
	{
		dest[dest_len + j] = src[j];
		j++;
	}
	dest[dest_len + j] = '\\0';
	if (dest_len < size)
		return (dest_len + src_len);
	return (src_len + size);
}
/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	char dest[10] = "addd";
	char dest2[10] = "addd";
	char src[] = "add";

	strlcat(dest, src, 2);
	printf("%lu\\n", strlcat(dest, src, 2));
	printf("%s\\n", dest);
	ft_strlcat(dest2, src, 2);
	printf("%d\\n", ft_strlcat(dest2, src, 2));
	printf("%s\\n", dest2);

}*/
#include <unistd.h>

unsigned int	ft_strlen(char *src)
{
	unsigned int	cnt;

	cnt = 0;
	while (src[cnt] != '\\0')
	{
		cnt++;
	}
	return (cnt);
}

unsigned int	ft_strlcat(char *dest, char *src, unsigned int size)
{
	unsigned int	j;
	unsigned int	dest_len;
	unsigned int	src_len;

	dest_len = ft_strlen(dest);
	src_len = ft_strlen(src);
	j = 0;
	if (size == 0)
		return (src_len);
	while ((src[j] != '\\0') && (dest_len + j + 1 < size))
	{
		dest[dest_len + j] = src[j];
		j++;
	}
	dest[dest_len + j] = '\\0';
	if (dest_len < size)
		return (dest_len + src_len);
	return (src_len + size);
}