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 |