문자열 s를 c문자 기준으로 나누어 배열의 각 칸에 저장하고 마지막 배열은 NULL로 채워 반환해주는 함수
char **ft_split(char const *s, char c)
🔩 parameters
*s : c를 기준으로 나눠줄 문자열
c : 문자열을 나누는 기준이 될 문자📬 return
char **형 반환
- 문자열 s를 c문자 기준으로 나누어 배열의 각 칸에 저장하고 마지막 배열은 NULL로 채워 반환
- 배열의 각 칸에 정보를 저장하다가 할당에 실패하여 함수를 종료할때 여태 malloc으로 할당했던 각 배열칸마다의 저장공간, 배열 자체의 저장공간을 모두 free시켜주어야 함. (메모리 누수 방지)
- 문자열의 첫 시작부분이 c라면 그부분을 넘겨주어야하고, 첫 시작부분이 c가 아니라면 만들어야하는 문자열의 수를 1 늘려주어야 한다
#include "libft.h"
//s문자열에서 n+1크기만큼의 저장공간을 할당하고 문자열을 저장하여 리턴해줌
char *ft_strndup(const char *s, size_t n)
{
size_t i;
char *str;
i = 0;
str = NULL;
if (n == 0)
return (NULL);
str = (char *)malloc(sizeof(char) * (n + 1));
if (str == 0)
return (NULL);
while (i < n)
{
str[i] = s[i];
i++;
}
str[i] = '\0';
return (str);
}
//list내부의 할당된 저장공간들을 모두 free해주고 list도 free해줌
char **ft_freeall(char **list)
{
size_t j;
j = 0;
while (list[j])
{
free(list[j]);
j++;
}
free(list);
return (NULL);
}
//문자열 s를 c문자를 기준으로 나누었을때 총 몇개의 저장공간이 필요한지 구하는 함수
size_t ft_wordcount(char const *s, char c)
{
size_t listsize;
size_t i;
i = 0;
listsize = 0;
while (s[i] != '\0')
{
if ((i == 0 && s[i] != c) || \
(s[i] == c && s[i + 1] != '\0' && s[i + 1] != c))
listsize++;
i++;
}
return (listsize);
}
char **ft_split(char const *s, char c)
{
char **strlist;
size_t i;
size_t k;
size_t save;
i = 0;
k = 0;
strlist = (char **)malloc(sizeof(char *) * (ft_wordcount(s, c) + 1));
if (!strlist)
return (NULL);
while (i < ft_wordcount(s, c) && s[k] != '\0')
{
while (s[k] == c)
k++;
save = k;
while (s[k] != c && s[k] != '\0')
k++;
strlist[i] = ft_strndup(&s[save], k - save);
if (strlist[i++] == 0)
return (ft_freeall(strlist));
}
strlist[i] = NULL;
return (strlist);
}