참고로 이 함수들의 반환값은 1, 0, -1 이 세가지이며 서로 문자를 비교할 때 묵시적 unsigned char로 형변환 합니다!
1은 왼쪽 문자가 더 큰경우
-1은 오른쪽 문자가 더 큰경우
0은 문자열이 같은 경우
1. strcmp
#include <string.h>
int strcmp(const char *s1, const char *s2)
s1 문자열과 s2 문자열이 서로 맞는지 확인해 주는 함수입니다.
문자열이 서로 맞다면 0, 다르다면 처음으로 다른 문자들의 차이값을 반환합니다.
strcmp 구현
int ft_strcmp(const char *s1, const char *s2)
{
size_t i;
i = 0;
while (s1[i] == s2[i])
{
if (!s1[i])
return (0);
i++;
}
if ((unsigned char)s1[i] > (unsigned char)s2[i])
return (1);
return (-1);
}
while 문으로 문자열이 서로 같을때까지 실행해 줍니다.
반복 실행 하다가 s1 문자열이 (s2 문자열이어도 상관없음) '\0' 문자라면 0 반환
만약 실행 하다가 서로 다르다면 while문에서 빠져나와 곧바로 서로 문자들을 비교해서 차이값을 반환할 겁니다.
2. strncmp
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n)
strcmp에서 반복 횟수 제한이 기능이 추가된 strncmp 함수입니다.
문자열을 전체 다 비교하는게 아닌 n번만 비교해야하는 경우에 사용하겠네요
strncmp 구현
int ft_strncmp(const char *s1, const char *s2, size_t n)
{
size_t i;
i = 0;
while (i < n && s1[i] == s2[i])
{
if (!s1[i])
return (0);
i++;
}
if (i == n)
return (0);
if ((unsigned char)s1[i] > (unsigned char)s2[i])
return (1);
return (-1);
}
구현 내용은strcmp랑 크게 다를게 없는데요.
단순히 n번까지만 반복하는 것이기 때문에 조건 2개만 추가하면 됩니다.
while 조건문으로 i < n, while 탈출후 if 조건문으로 i == n
위 두가지 조건 2개만 있으면 strncmp가 완성되죠
3. memcmp
#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);
많은 분들이 strncmp와 memcmp의 차이점을 모르실 겁니다.
strncmp는 n번 비교하면서 '\0'문자를 만나면 종료하지만
memcmp는 무조건 n번 비교합니다. 즉 '\0'문자를 만나도 n번 실행되지 않았다면 계속 반복하죠
예를 들어
"hello \0world", "hello \0world and C", 17
두 함수가 위처럼 매개변수를 가졌을 때
strncmp는 0을 반환하지만 memcmp의 경우 -1을 반환합니다.
memcmp 구현
int ft_memcmp(const void *s1, const void *s2, size_t n)
{
size_t i;
unsigned char *str1;
unsigned char *str2;
str1 = (unsigned char *)s1;
str2 = (unsigned char *)s2;
i = 0;
while (i < n)
{
if ((unsigned char)str1[i] > (unsigned char)str2[i])
return (1);
else if ((unsigned char)str1[i] < (unsigned char)str2[i])
return (-1);
i++;
}
return (0);
}
strncmp와 memcmp의 차이는 별 상관이 없으나 그래도 괜히 함수를 하나 더 많든게 아니겠죠?
함수를 많드신 분들을 위해 기억해 줍시다.
'C' 카테고리의 다른 글
[C언어] 비트 연산자를 활용하여 계산기 만들기 (0) | 2024.08.04 |
---|---|
[C] strdup, strjoin, split 구현 (0) | 2023.12.05 |
[C] strcat / strncat / strlcat 사용법과 구현 (0) | 2023.02.04 |
[C] strlen / strcpy / strncpy / strlcpy 사용법과 구현 (0) | 2023.02.02 |
[C] itoa / atoi 구현 (1) | 2023.01.29 |