📌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);
}
반응형
'➰ 코딩 부트캠프 > 42 seoul' 카테고리의 다른 글
[0 Circle] Libft - ft_putchar_fd, ft_putstr_fd, ft_putendl_fd, ft_putnbr_fd (0) | 2021.01.04 |
---|---|
[0 Circle] Libft - ft_itoa, ft_strmapi (0) | 2021.01.04 |
[0 Circle] Libft - ft_substr, ft_strjoin (0) | 2021.01.04 |
[0 Circle] Libft - ft_calloc, ft_strdup (0) | 2021.01.04 |
[0 Circle] Libft - ft_isalpha, ft_isdigit, ft_isalnum, ft_isascii, ft_isprint, ft_toupper, ft_tolower (0) | 2021.01.04 |