본문 바로가기
42Seoul/libft

ft_memcmp

by 하고싶은건많은놈 2023. 2. 16.

memcmp?

#include <string.h>

    int memcmp(const void *s1, const void *s2, size_t n);

Linux manpage description

: The memcmp() function returns an integer less than, equal to, or greater than zero if the first n bytes of s1 is found, respectively, to be less than, to match, or be greater than the first n bytes of s2.
For a nonzero return value, the sign is determined by the sign of the difference between the first pair of bytes (interpreted as unsigned char) that differ in s1 and s2.
If n is zero, the return value is zero.

해석 및 부연설명

: NUL에 반응하지 않는다는 것만 빼면 strncmp 함수와 동일하게 작동한다.
여담인데, memcmp의 메뉴얼이 strncmp것보다 훨씬 더 자세하다. 값의 차이를 반환한다는 것, n이 0일 때 0을 반환한다는 것 등등을 strncmp의 메뉴얼에서는 알려주지 않았던 이유가 뭘까…

ex)

char	s1[] = "abcdefg";
char	s2[] = "abcdddd";
printf("%d\n", memcmp(s1, s2, 5));

코드 실행 결과

1

특별히 살펴볼 점은 없는 것 같다.

의문점 및 생각해볼점

  1. n의 크기에 따른 작동

n의 크기별 반환

  1. n이 s1, s2 양 문자열의 길이보다 작을 경우에는 평범하게 작동한다.
  2. n이 s1과 s2 길이의 사이에 껴있다면 문자 하나씩 비교를 하다가 한쪽 문자열이 끝나는 0에서 마지막 비교가 이루어지기 때문에 신경쓰지 않아도 된다.
  3. s1과 s2의 길이와 내용이 같고, n이 그 길이보다 클 경우에는 정상적인 비교가 이루어지지 않는다. strncmp와는 달리 \0에서 멈추지 않고 문자열의 범위를 넘어가는 메모리까지 참조하기 때문이다.

ft_memcmp 구현

int	ft_memcmp(const void *str1, const void *str2, size_t size)
{
	unsigned char	*str1_char;
	unsigned char	*str2_char;

	str1_char = (unsigned char *)str1;
	str2_char = (unsigned char *)str2;
	while (size-- > 0)
	{
		if (*str1_char != *str2_char)
			return (*str1_char - *str2_char);
		str1_char++;
		str2_char++;
	}
	return (0);
}

NUL 확인 부분만 빼면 ft_strncmp 함수와 완벽하게 같다.

'42Seoul > libft' 카테고리의 다른 글

ft_strnstr  (0) 2023.02.16
ft_strdup  (0) 2023.02.16
ft_memchr  (0) 2023.02.16
ft_calloc  (0) 2023.02.16
ft_atoi  (0) 2023.02.16

댓글