42Seoul/Libft

[C] 나만의 라이브러리 - strlen strlcpy strlcat strchr strrchr strnstr strncmp

  • -
728x90

1. strlen

size_t my_strlen(const char *s);

문자열의 길이를 구하는 함수

size_t    my_strlen(const char *s)
{
    size_t    i;

    i = 0;
    while (s[i])
        i++;
    return (i);
}
  • 해당 문자열의 끝을 의미하는 \0 값을 찾을때까지 길이를 구한다.

2. strlcpy

size_t my_strlcpy(char *dest, const char *src, size_t size);

src 에서 size만큼(\0 포함) 복사하는 함수

size_t    my_strlcpy(char *dest, const char *src, size_t size)
{
    const char    *s;
    size_t        n;

    s = src;
    n = size;        // n에 size 복사
    if (!dest && !src)
        return (0);
    if (n != 0)        // n이 0이 아닐때
    {
        while (--n != 0)    // 널 값을 제외하고 복사하기 위해 n을 먼저 감소 시키고 반복
        {
            if ((*dest = *s) == '\0')    // n을 다 돌기전에 널 값인경우 종료 (size가 src의 길이보다 긴 경우)
                break ;
            dest++;
            s++;
        }
    }
    if (n == 0)    // 위에서 n이 다 돌았거나 size가 0인경우
    {
        if (size != 0)    // n이 다 돌았으면 마지막에 널 값 넣어줌
            *dest = '\0';
        while (*s)    // size가 0인경우 src의 길이를 반환하기 위함
            s++;
    }
    return (s - src);
}

3. strlcat

size_t my_strlcat(char *dst, const char *src, size_t size);

dst뒤에 src의 값들을 n만큼 복사하는 함수

size_t    my_strlcat(char *dst, const char *src, size_t size)
{
    const char    *s;
    char        *d;
    size_t        n;
    size_t        dlen;

    s = src;
    d = dst;
    n = size;
    while (n-- != 0 && *d != '\0')
        d++;
    dlen = d - dst;
    n = size - dlen;
    if (n == 0)
        return (dlen + my_strlen(s));
    while (*s != '\0')
    {
        if (n != 1)
        {
            *d++ = *s;
            n--;
        }
        s++;
    }
    *d = '\0';
    return (dlen + (s - src));
}

4. strchr

char *my_strchr(const char *s, int c);

s에서c의 값을 찾아 해당 주소를 반환하는 함수

char    *my_strchr(const char *s, int c)
{
    char    *ret;

    ret = 0;
    while (*s)
    {
        if (*s == (char)c)
            return ((char *)s);
        s++;
    }
    if (!c)
        return ((char *)s);
    return (ret);
}

5. strrchr

char *my_strrchr(const char *s, int c);

s뒤에서부터c의 값을 찾아 해당 주소를 반환하는 함수

char    *my_strrchr(const char *s, int c)
{
    char    *ret;

    ret = 0;
    while (*s)
    {
        if (*s == (char)c)
            ret = (char *)s;
        s++;
    }
    if (!c)
        return ((char *)s);
    return (ret);
}
  • strchr과 차이는 c값이 여러 개 일때 앞에서부터 탐색하여 찾자마자 그 주소를 반환하느냐, 마지막 c를 찾아서 그 주소를 반환하느냐의 차이이다.

6. strnstr

char *my_strnstr(const char *big, const char *little, size_t len);

특정 문자열을 찾아 그 문자열이 시작하는 주소를 반환하는 함수

char    *my_strnstr(const char *big, const char *little, size_t len)
{
    size_t    llen;
    size_t    blen;
    size_t    i;

    if (!*little)
        return ((char *)big);
    llen = my_strlen(little);
    blen = my_strlen(big);
    i = 0;
    if (blen < llen || len < llen)
        return (0);
    while (i + llen <= len)
    {
        if (big[i] == *little && !my_strncmp(big + i, little, llen))
            return ((char *)big + i);
        i++;
    }
    return (0);
}

7. strncmp

int my_strncmp(const char *s1, const char *s2, size_t n);

s1 이 가리키는 처음 n 바이트의 데이터와 s2 가 가리키는 처음 n 바이트의 데이터를 비교하는 함수

int    my_strncmp(const char *s1, const char *s2, size_t n)
{
    while (n--)
    {
        if (*s1 != *s2)
            return (*(unsigned char *)s1 - *(unsigned char *)s2);
        if (*s1)
            s1++;
        if (*s2)
            s2++;
    }
    return (0);
}
  • 비교대상의 차이를 반환
728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.