#include <stdio.h>

#include <unistd.h>

unsigned int	ft_strlen(char *src)
{
	unsigned int	i;
    
	i = 0;
	while (src[i] != '\\0')
	{
		i++;
	}
	return (i);
}

unsigned int	ft_strlcpy(char *dest, char *src, unsigned int size)
{
	int		i;
  unsigned int src_len = ft_strlen(src);
	unsigned int dest_len = ft_strlen(dest);
  
	i = 0;
	if (dest_len == 0 || src_len == 0)
	{
		return (0);
	}
	while (i < size - 1)
	{
		dest[i] = src[i];
		i++;
	}
	dest = '\\0';
	return (src_len);
}

int main() {
    char a[] = "ABCdefGHI";
    char b[] = "asdsff";
    
    printf("%d", ft_strlcpy(a,b,3));
    
    return 0;
}

컴파일 했을 때 원래 라이브러리에 있는 함수와 결과값이 같아서 OK가 뜰 줄 알았는데,

KO가 떴다. 코드를 수정할 필요가 있음.

일단 애플 오픈소스에 나와있는 strlcpy의 코드는 다음과 같다.

#include "string.h"

#undef strlcpy
size_t
strlcpy(char * dst, const char * src, size_t maxlen) {
    const size_t srclen = strlen(src);
    if (srclen + 1 < maxlen) {
        memcpy(dst, src, srclen + 1);
    } else if (maxlen != 0) {
        memcpy(dst, src, maxlen - 1);
        dst[maxlen-1] = '\\0';
    }
    return srclen;
}

자세히 찾아보니 strlcpy는 표준함수가 아니라고 한다. (Non-standard function)

#include <unistd.h>

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

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

unsigned int	ft_strlcpy(char *dest, char *src, unsigned int size)
{
	unsigned int	i;
	unsigned int	src_len;

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

int	main(void)
{
	char dest[20] = "adg";
	char dest2[20] = "adg";
	char src[] = "sdsds";

	printf("%d\\n", ft_strlcpy(dest, src, 20));
	printf("%s", dest);
	printf("\\n");
	printf("%lu\\n", strlcpy(dest2, src, 20));
	printf("%s", dest2);
}

strlcpy 함순는 어떤 경우에서도 src의 길이를 리턴하는 함수이다.

단 신경 써야 할 조건이 있는데, size 변수의 크기가 0일 때 dest를 그대로 출력해야 한다는 것.

그리고 size가 unsigned int 자료형이기 때문에 0 이하로 내려가면 안된다는 것이다.

그래서 size - 1을 이항 처리 해야 한다.