[C] strcmp / strncmp / memcmp 사용법과 구현 및 strncmp와 memcmp의 차이
본문 바로가기

C

[C] strcmp / strncmp / memcmp 사용법과 구현 및 strncmp와 memcmp의 차이

728x90
반응형

문자열 알고리즘 문제를 풀다보면 해당 문자열이 이 문자열이 맞는지 판별해주는 함수들이 필요할때가 있죠

 

목차

  • strcmp
  • strncmp
  • memcmp

 

그때 사용하는 함수가 cmp 계열 함수들입니다.

이번 포스팅에서는 cmp 계열 함수들에 대해 알아보고 직접 구현해보도록 합시다.

참고로 이 함수들의 반환값은 1, 0, -1 이 세가지이며 서로 문자를 비교할 때 묵시적 unsigned char로 형변환 합니다!

1은 왼쪽 문자가 더 큰경우

-1은 오른쪽 문자가 더 큰경우

0은 문자열이 같은 경우

 

반응형

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문에서 빠져나와 곧바로 서로 문자들을 비교해서 차이값을 반환할 겁니다.

 


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가 완성되죠

 


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의 차이는 별 상관이 없으나 그래도 괜히 함수를 하나 더 많든게 아니겠죠?

함수를 많드신 분들을 위해 기억해 줍시다.

728x90
반응형