42서울 - split 함수 구현

박경현·2023년 10월 19일
0

예전에 작성했던 split보다 좀 더(?) 복잡한 형식의 split함수를 구현했었다.

추가된건 free를 해줘야하는 부분 밖에 없었지만..

split 함수 구현을 위한 단계 설정

split 함수 간단한 설명

split함수는 "a,b,c" 같은 문자열을 ',' 같은 반복적인 구분자를 이용해
['a' , 'b', 'c'] 이렇게 문자열 배열로 나누는 것을 말한다!

split 함수 구현을 위한 설명

char ** ft_split(const char s, char c)

  1. 인자로 들어오는 s가 널인지 확인! -> s가 널이면 바로 널을 반환!
  2. 구분자인 c로 나눴을때 총 몇개로 나뉘는지 확인하자 -> 총 배열 길이를 구하기!
  3. 새로운 char 이차원 포인터를 만들고 제대로 만들어지는지 확인!
  4. 문자열 개수만큼 돌면서 각각 문자열들 문자열 배열에 넣어주기!!

split 코드 설명

#include <stdio.h>
#include <stdlib.h>

static void	ft_freeup(char **ptr, size_t idx)
{
	while (idx > 0)
    {
    	idx--;
        free(ptr[idx]);
    }
    free(ptr);
    return (0);
}

static size_t	ft_count_words(const char *s, char c)
{
	size_t	i;
    size_t	cnt;
    
    i = 0;
    cnt = 0;
    while (s[i] != '\0')
    {
    	if (s[i] == c)
        	i++;
        else
        {
        	cnt++;
            while (s[i] && s[i] != c)
            	i++;
        }
    }
    return (cnt);
}

static void ft_put_word(char *ptr_word, const char *s, size_t i, size_t word_len)
{
	size_t j;
    
    j = 0;
    while (word_len > 0)
    {
    	ptr_word[j] = s[i - word_len];
        word_len--;
        j++;
    }
    ptr_word[j] = '\0';
}

static char	**ft_put_words(char **ptr, const char *s, char c, size_t len)
{
	size_t	i;
    size_t	word;
    size_t	word_len;
    
    i = 0;
    word = 0;
    word_len = 0;
    while (word < len)
    {
    	if (s[i] && s[i] == c)
        	i++;
        while (s[i] && s[i] != c)
        {
        	i++;
        	word_len++;
        }
        ptr[word] = (char *)malloc(sizeof(char) * (word_len + 1));
        if (!ptr[word])
        	ft_freeup(ptr, word);
        ft_put_word(ptr[word], s, i, word_len);
        word++;
        word_len = 0;
    }
    ptr[word] = '\0';
	return (ptr);
}

char **ft_split(const char *s, char c)
{
	size_t	len;
    char	**ptr;

	if (!s)
    	return (0);
    len = ft_count_words(s, c); 
    ptr = (char **)malloc(sizeof(char **) * (len + 1));
    if (!ptr)
    	return (0);
    ptr = ft_put_words(ptr, s, c, len);
    return (ptr);
}

피드백

Makefile이랑 libft.h인 헤더파일 만드는 방법도 밤에 추가하자!!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글