ft_split

jen133·2022년 1월 16일
0

libft

목록 보기
27/44

💻 ft_split

문자열 s를 c문자 기준으로 나누어 배열의 각 칸에 저장하고 마지막 배열은 NULL로 채워 반환해주는 함수

📃 ft_split 원형

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);
}

profile
늅늅

0개의 댓글