개발/C
[C][TIL] strlcat, memcmp 함수 구현
챀
2024. 3. 3. 22:40
strlcat 구현 시 주의사항
size가 0일 경우, '/0'도 복사하면 안된다.
다음 사진에서 size == 0이 생략되면 틀린 코드가 된다.
#include "libft.h"
size_t ft_strlcpy(char *dst, const char *src, size_t size)
{
size_t i;
i = 0;
if (dst == 0 || size == 0)
return (ft_strlen(src));
while (src[i] && i + 1 < size)
{
dst[i] = src[i];
++i;
}
dst[i] = '\0';
return (ft_strlen(src));
}
memcmp에서 다음과 같이 짜면 안 된다.
n이 10인 경우, 인덱스 9까지 while문 을 실행하고 인덱스 10이 되어 탈출하는데,
return으로 [9]가 아닌 [10]의 차를 반환한다.
#include <stddef.h>
int ft_memcmp(const void *s1, const void *s2, size_t n)
{
size_t i;
if (n == 0)
return (0);
i = 0;
while (((unsigned char *)s1)[i] == ((unsigned char *)s2)[i]
&& ((unsigned char *)s1)[i] && i < n)
++i;
return (((unsigned char *)s1)[i] - ((unsigned char *)s2)[i]);
}
수정된 코드는 다음과 같다.
#include <stddef.h>
int ft_memcmp(const void *s1, const void *s2, size_t n)
{
size_t i;
unsigned char *temp1;
unsigned char *temp2;
temp1 = (unsigned char *)s1;
temp2 = (unsigned char *)s2;
if (n == 0)
return (0);
i = 0;
while (i < n)
{
if (temp1[i] != temp2[i])
return (temp1[i] - temp2[i]);
++i;
}
return (0);
}
반응형