Dia Egg - Shugo Chara

C

memcmp 함수의 구현

별ㅇI 2023. 10. 17. 13:49
728x90
반응형
int	ft_memcmp(const void *s1, const void *s2, size_t n)
{
	size_t			i;
	unsigned char	*n_s1;
	unsigned char	*n_s2;

	i = 0;
	n_s1 = (unsigned char *)s1;
	n_s2 = (unsigned char *)s2;
	while (i < n)
	{
		if (n_s1[i] != n_s2[i])
		{
			return (n_s1[i] - n_s2[i]);
		}
		i++;
	}
	return (0);
}
// #include <stdio.h>
// #include <string.h>
// int	main(void)
// {
// 	char *s1 = "applepie";
// 	char *s2 = "applejam";
// 	printf("test1 : memcmp : %d", memcmp(s1, s2, 5));
// 	printf("\ntest1 : ft_memcmp : %d", ft_memcmp(s1, s2, 5));
// 	printf("\ntest2 : memcmp : %d", memcmp(s1, s2, 6));
// 	printf("\ntest2 : ft_memcmp : %d", ft_memcmp(s1, s2, 6));
// 	printf("\ntest2 : memcmp : %d", memcmp(s1, s2, 0));
// 	printf("\ntest2 : ft_memcmp : %d", ft_memcmp(s1, s2, 0));
// 	char *s3 = "\0";
// 	char *s4 = "\0";
// 	printf("\ntest3 : memcmp : %d", memcmp(s3, s4, 6));
// 	printf("\ntest3 : ft_memcmp : %d", ft_memcmp(s3, s4, 6));
// }

memcmp 함수

  • string.h 헤더파일에 속한 함수.
  • 원형은 int memcmp(const void *s1, const void *s2, size_t n)를 따른다. 
  •  s1 과 s2를 비교하여 두 문자가 동일하면 0, 그렇지 않고 s1가 큰경우 양수. 작은경우 음수를 반환한다. (s1 - s2)

의문점 

mem함수는 숫자, 구조체, 문자열 등 다양한 구조에서 사용하기 위한 목적으로 만들어진 함수이기 떄문에 매개변수로 받는 size만을 통해 종료시점을 가진다는 점에서 str함수와 다르다고 이해하고 있었는데, 의문점이 생겼다. 원형을 보면 s1, s2가 void *형으로 나타나는 것을 볼 수 있는데,  그럼 무슨 형으로 바꿔야하지 하는 의문이 생기는 것이다. 매뉴얼을 살펴봤는데

string이라고 표현되는 것을 볼 수 있다. c언어에서의 정의에 따르면 str, 즉 문자열은 널 문자로 끝나는 문자의 시퀀스이다. 따라서 최대 unsigned char, 그냥 종료조건에 차이를 주는 것만 고려하는 듯하다. 근데, 여기서 또 의문점... signed char은 unsigned char 로 형변환이 자유로운가? 명시적 형변환만 하면 상관없는 듯하다. 다만 이건 찾아보다 알게된건데 unsigned char에서 int로의 형변환은 고려를 좀 해줘야한다. 부호비트를 읽는 과정에서 문제가 난다고 한다. 해결법은 작은 크기의 signed 형 (signed char)으로 변경후 int변경을 해주면 된다. 

memcmp 함수의 구현

 

728x90
반응형

'C' 카테고리의 다른 글

calloc 함수 구현  (0) 2023.10.21
strnstr 함수의 구현  (0) 2023.10.17
memchr 함수의 구현 (mem함수와 str함수의 차이)  (0) 2023.10.16
strncmp 함수의 구현  (2) 2023.10.16
strrchr 함수의 구현  (0) 2023.10.16