ft_strncmp 구현

yeonjkim·2021년 5월 24일
0

42seoul-libft

목록 보기
29/43

1. ft_strncmp 용도

* 문자열 s1과 s2를 n번만큼 비교하되, 비교 중 다른 문자가 나오면 값을 리턴하는 함수. 
n번까지 두 개의 문자열의 문자 모두가 일치한다면 0을 리턴한다.

* 비교 중 다른 문자가 나왔을 때, 아스키 코드상으로 s1이 s2보다 더 큰 문자가 나온다면 양수를, s2가 더 큰 문자가 나온다면 음수를 리턴한다.

2. ft_strncmp 프로토타입

int		ft_strncmp(const char *s1, const char *s2, size_t)
const char *s1 : 비교할 문자열 중 하나
const char *s2 : 비교할 문자열 중 하나
size_t n : 비교할 숫자

3. 구현 시 유의사항

  • 내가 짠 코드에서는 s1[index] != '\0'이 아니고, index가 n보다 작을때 s1과 s2를 비교하였다.
    이 때 주의해야 할 것이, index가 아직 n보다 작은데 s1의 길이가 n보다 작을 때이다. 이때는 s1[index]가 '\0'인데 이 때에도 s2와 비교를 해야 함에 주의한다.

  • s1과 s2를 unsigned char *로 형변환해야 한다.

    --> unsigned char모든 bit를 투명하게 볼 수 있는 특성을 제공한다.
    즉 다른 type은 내부 비트의 일부를 값을 표현하기 위한 용도가 아닌 다른 용도로 사용할 수 있으나 unsigned char는 이것이 허락되지 않아 mem함수, str함수에서는 unsigned char을 이용한다.

4. 코드 구현

#include "libft.h"

int             ft_strncmp(const char *s1, const char *s2, size_t n)
{
        size_t          index;
        unsigned char   *cp1;
        unsigned char   *cp2;

        cp1 = (unsigned char*)s1;
        cp2 = (unsigned char*)s2;
        index = 0;
        while (cp1[index] != '\0' && index < n)
        {
                if (cp1[index] != cp2[index])
                {
                        return (cp1[index] - s2[index]);
                }
                index++;
        }
        if (cp1[index] == '\0' && index < n)
        {
                return (cp1[index] - cp2[index]);
        }
        return (0);
}

5. 코드 구현 방법

(1) index를 0으로 초기화하고, s1과 s2를 unsigned char*형 변수 cp1과 cp2로 형변환.
(2) cp1[index]가 '\0'이 아니고 index가 n보다 작을때까지 비교. cp1[index] > cp2[index]이면 양수, 반대이면 음수이기에 cp1과 cp2의 차를 반환.
(3) cp1[index]가 '\0'이고, index가 n보다 작다면 cp1[index]가 '\0'일 때도 비교해 줘야 하므로 cp1과 cp2의 차이 리턴.
(4) 모든 경우에 속하지 않는다면 두 문자열은 n까지 모두 같은 것이므로 0을 리턴.

0개의 댓글