#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을 이항 처리 해야 한다.