[libft] ft_memcmp
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
특별히 살펴볼 점은 없는 것 같다.
의문점 및 생각해볼점
n의 크기별 반환
- n이 s1, s2 양 문자열의 길이보다 작을 경우에는 평범하게 작동한다.
- n이 s1과 s2 길이의 사이에 껴있다면 문자 하나씩 비교를 하다가 한쪽 문자열이 끝나는 0에서 마지막 비교가 이루어지기 때문에 신경쓰지 않아도 된다.
- 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
함수와 완벽하게 같다.