может быть кому то будет полезно # include <stdlib.h> # include <unistd.h> size_t ft_strlen(const char *str) { size_t len; len = 0; while (str[len]) len++; return (len); } char *ft_substr(char const *s, unsigned int start, size_t len) { char *ptr; size_t index; size_t slen; index = 0; if (!s) return (NULL); if (ft_strlen(s) < start) { ptr = malloc(sizeof(char)); ptr[0] = '\0'; return (ptr); } slen = ft_strlen(s + start); if (slen < len) len = slen; ptr = (char *)malloc(len); if (!ptr) return (0); while (index < len) ptr[index++] = s[start++]; ptr[index] = '\0'; return (ptr); } static size_t ft_msize(char const *s, char c) { size_t i; i = 0; while (*s) { i++; while (*s && *s == c) s++; if (*s == '\0') i--; while (*s && *s != c) s++; } return (i); } static void ft_free(char **str) { size_t i; i = 0; while (str[i++]) free(str[i]); free(str); } static char **ft_writter(char **split, char const *s, char c) { size_t len; size_t i; i = 0; while (*s) { if (*s != c) { len = 0; while (*s && *s != c) { len++; s++; } split[i] = ft_substr(s - len, 0, len); if (!split[i++]) ft_free(split); } else s++; } split[i] = 0; return (split); } char **ft_split(char const *s, char c) { char **split; size_t msize; if (!s) return (NULL); msize = ft_msize(s, c); split = malloc(sizeof(char *) * (msize + 1)); if (!split) return (NULL); split = ft_writter(split, s, c); return (split); } C # include <stdlib.h> # include <unistd.h> size_t ft_strlen(const char *str) { size_t len; len = 0; while (str[len]) len++; return (len); } char *ft_substr(char const *s, unsigned int start, size_t len) { char *ptr; size_t index; size_t slen; index = 0; if (!s) return (NULL); if (ft_strlen(s) < start) { ptr = malloc(sizeof(char)); ptr[0] = '\0'; return (ptr); } slen = ft_strlen(s + start); if (slen < len) len = slen; ptr = (char *)malloc(len); if (!ptr) return (0); while (index < len) ptr[index++] = s[start++]; ptr[index] = '\0'; return (ptr); } static size_t ft_msize(char const *s, char c) { size_t i; i = 0; while (*s) { i++; while (*s && *s == c) s++; if (*s == '\0') i--; while (*s && *s != c) s++; } return (i); } static void ft_free(char **str) { size_t i; i = 0; while (str[i++]) free(str[i]); free(str); } static char **ft_writter(char **split, char const *s, char c) { size_t len; size_t i; i = 0; while (*s) { if (*s != c) { len = 0; while (*s && *s != c) { len++; s++; } split[i] = ft_substr(s - len, 0, len); if (!split[i++]) ft_free(split); } else s++; } split[i] = 0; return (split); } char **ft_split(char const *s, char c) { char **split; size_t msize; if (!s) return (NULL); msize = ft_msize(s, c); split = malloc(sizeof(char *) * (msize + 1)); if (!split) return (NULL); split = ft_writter(split, s, c); return (split); } ну вообщем то так. буду постепенно добавить функции в моч библиотеку. вот ссылку, если что нибудь будет надо, держите :)
Новерно ты так задумывал (я надеюсь), но я бы ожидал что ft_split("abba", 'b') и ft_split("aba", 'b') будут возвращать разный результат.