ft_split
Subject
Assignment name : ft_split
Expected files : ft_split.c
Allowed functions: malloc
--------------------------------------------------------------------------------
Write a function that takes a string, splits it into words, and returns them as
a NULL-terminated array of strings.
A "word" is defined as a part of a string delimited either by spaces/tabs/new
lines, or by the start/end of the string.
Your function must be declared as follows:
char **ft_split(char *str);
Commented solution
ft_split
ft_split.c
#include "stdlib.h"
#include "unistd.h"
int count_words(char *str)
{
int i;
int count;
i = 0;
count = 0;
while (str[i] != '\0')
{
while (str[i] == ' ' || str[i] == '\t' || str[i] == '\n')
i++;
if (str[i] != '\0')
count++;
while (str[i] != '\0' && str[i] != ' ' && str[i] != '\t'
&& str[i] != '\n')
i++;
}
return (count);
}
void copy_words(char *tab, char *str, int start, int end)
{
int j;
j = 0;
while (start < end)
tab[j++] = str[start++];
tab[j] = '\0';
}
int find_next_word(char *str, int *start, int *end)
{
int i;
i = *end;
while (str[i] != '\0' && (str[i] == ' ' || str[i] == '\t'
|| str[i] == '\n'))
i++;
*start = i;
while (str[i] != '\0' && str[i] != ' ' && str[i] != '\t' && str[i] != '\n')
i++;
*end = i;
return (*start < *end);
}
int ft_fill_words(char **tab, char *str)
{
int i;
int word;
int start;
int end;
i = 0;
word = 0;
start = 0;
end = 0;
while (find_next_word(str, &start, &end))
{
tab[word] = malloc((end - start + 1) * sizeof(char));
if (tab[word] == NULL)
{
i = 0;
while (i < word)
free(tab[i++]);
free(tab);
return (0);
}
copy_words(tab[word], str, start, end);
word++;
}
tab[word] = NULL;
return (1);
}
char **ft_split(char *str)
{
char **out;
int size;
size = count_words(str);
out = malloc((sizeof(char *) * (size + 1)));
if (!out)
return (NULL);
if (!ft_fill_words(out, str))
{
free(out);
return (NULL);
}
return (out);
}
Last updated
Was this helpful?