개발/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);
}
반응형