➰ 코딩 부트캠프/42 seoul

[0 Circle] Libft - ft_strtrim, ft_split

 사과개발자 2021. 1. 4. 22:09

📌ft_strtrim

(왼쪽에서 set이 아닌 문자나오지 않는 부분)부터
(오른쪽에서 set이 아닌 문자가 나오지 않는 부분)까지의 문자열로 잘라는 함수

char *ft_strtrim(char const *s1, char const *set);

➕ 매개변수 (Parameters)

  • s1 : 원본 문자열
  • set : 있으면 안되는 문자들을 가지고 있는 문자열

➕ 반환값 (Return)

  • char * : 부분 문자열 반환

➕ 설명 (Description)

➕ 코드 (Code)

#include "libft.h"

char    *ft_strtrim(char const *s1, char const *set)
{
    size_t    start;
    size_t    end;
    size_t    i;

    if (!s1)
        return (0);
    i = 0;
    start = 0;
    end = ft_strlen(s1) - 1;
    while (s1[i] && ft_strchr(set, s1[i]))
        start = (i++) + 1;
    if (start >= ft_strlen(s1))
        return ((char *)ft_calloc(sizeof(char), 1));
    i = ft_strlen(s1) - 1;
    while (i && s1[i] && ft_strchr(set, s1[i]))
        end = (i--) - 1;
    return (ft_substr(s1, start, (end - start + 1)));
}

📌ft_split

set에 있는 문자를 기준으로 문자열 잘라서 이차원 문자열 배열로 반환

char **ft_split(const char *s, char d);

➕ 매개변수 (Parameters)

  • s : 원본 문자열
  • d : 기준이 되는 문자

➕ 반환값 (Return)

  • char ** : 2차원 문자열 배열

➕ 설명 (Description)

  • ft_freeall 을 통해서 이차원 배열을 malloc해주는 과정에서 중간에 에러가 났어도 지금까지 할당해준 부분을 모두
    free시켜준 상태에서 전체 배열도 free해주어야 memory leak이 발생하지 않는다
  • 모든 단어의 끝부분에 '\0'을 넣어주어야 하는 부분을 놓치면 안된다!       (저는 이 부분을 못 잡아내서 segmentation fault가 떴는데 ft_calloc 을 통해 동적할당을 시켜줌으로써 해결했습니다!)

➕ 코드 (Code)

#include "libft.h"

static char            **ft_freeall(char **s)
{
    unsigned int    i;

    i = 0;
    while (s[i] != NULL)
    {
        free(s[i]);
        i++;
    }
    free(s);
    return (NULL);
}

static size_t        ft_wordcnt(const char *s, char d)
{
    size_t            cnt;
    size_t            i;

    cnt = 0;
    i = 0;
    while (s[i])
    {
        if (s[i] != d)
        {
            cnt++;
            while (s[i] && s[i] != d)
                i++;
        }
        else
            i++;
    }
    return (cnt);
}

static char            *ft_worddup(const char *s, char d)
{
    size_t            len;
    char            *ptr;

    len = 0;
    while (s[len] && s[len] != d)
        len++;
    if (!(ptr = (char *)ft_calloc(len + 1, sizeof(char))))
        return (NULL);
    ft_strlcpy(ptr, s, len + 1);
    return (ptr);
}

char                **ft_split(const char *s, char d)
{
    char            **ptr;
    size_t            len;
    size_t            i;
    size_t            j;

    if (!s)
        return (NULL);
    len = ft_wordcnt(s, d);
    if (!(ptr = (char **)ft_calloc(len + 1, sizeof(char *))))
        return (NULL);
    i = 0;
    j = 0;
    while (i < len && s[j])
    {
        if (s[j] != d)
        {
            if (!(ptr[i++] = ft_worddup(&(s[j]), d)))
                return (ft_freeall(ptr));
            while (s[j] && s[j] != d)
                j++;
        }
        else
            j++;
    }
    return (ptr);
}
반응형