Libft part2


ft_substr


SUBSTR関数は文字単位で、開始位置と長さを指定することで文字列を切り捨てます.
  • 関数: SUBSTR(「文字列」,「開始位置」,「長さ」)
  • #include"libft.h"
    
    char	*ft_substr(char const	*s, unsigned int	start, size_t	len)
    {
    	size_t	i;
    	size_t	j;
    	char	*res;
    
    	i = 0;
    	j = 0;
    	if (!s)
    		return (NULL);
    	res = (char *)malloc(sizeof(char) * (len + 1));
    	if (!res)
    		return (NULL);
    	while (s[i])
    	{
    		if (i >= start && j < len)
    		{
    			res[j] = s[i];
    			j++;
    		}
    		i++;
    	}
    	res[j] = '\0';
    	return (res);
    }

    ft_strjoin


    char ft_strjoin(char const s1, char const *s2);
    malloc(3)を使用してメモリを割り当てると、文字列「s 1」と「s 2」を接続する新しい文字列が作成され、返されます.
    #include"libft.h"
    
    char	*ft_strjoin(char const	*s1, char const	*s2)
    {
    	size_t	len_s1;
    	size_t	len_s2;
    	char	*res;
    
    	if (!s1 || !s2)
    		return (NULL);
    	len_s1 = ft_strlen(s1);
    	len_s2 = ft_strlen(s2);
    	res = (char *)malloc(sizeof(char) * (len_s1 + len_s2 + 1));
    	if (!res)
    		return (NULL);
    	ft_memcpy(res, s1, len_s1);
    	ft_memcpy(res + len_s1, s2, len_s2);
    	res[len_s1 + len_s2] = 0;
    	return (res);
    }

    ft_strtrim


    char ft_strtrim(char const s1, char const *set)
    戻り値s1で見つけた  setに含まれる文字を両端から削除して生成した文字列は、割り当てに失敗した場合はNULLを返します.
    説明:
    malloc(3)割当てを使用して、文字列の先頭と末尾から指定した文字を削除する「s 1」コピーを返します.
    #include"libft.h"
    
    char	*ft_strtrim(char const	*s1, char const	*set)
    {
    	size_t	start;
    	size_t	end;
    	char	*res;
    
    	if (!s1)
    		return (NULL);
    	if (!set)
    		return (ft_strdup(s1));
    	start = 0;
    	end = ft_strlen(s1);
    	while (s1[start] && ft_strchr(set, s1[start]))
    		start++;
    	while (s1[end - 1] && ft_strchr(set, s1[end - 1]))
    	{
    		if (end - 1 < 1)
    			break ;
    		end--;
    	}
    	if (start > end)
    		return (ft_strdup(""));
    	res = (char *)malloc(sizeof(char) * (end - start + 1));
    	if (!res)
    		return (NULL);
    	ft_strlcpy(res, s1 + start, end - start + 1);
    	return (res);
    }

    ft_split


    char *ft_split(char str, char *charset)
    charsetセパレータに基づいてstr文字列が返す関数を分割
    分割された新しい文字列配列は、割り当てに失敗したときにNULLを返します.
    split関数は2 Dメモリを割り当てる関数なので、メモリを解放することを忘れずに実行する必要があります.
    sizeof(char)(ft word cnt(str,c)+1)カッコ付けなしAbortエラー
    文で続行しない
    →strの値をcと同時にstrのアドレス値を2回増加
    ft split関数もft word cntも追加し続けます
    #include"libft.h"
    
    char	**ft_free(char	**res)
    {
    	unsigned int	i;
    
    	i = 0;
    	while (res[i])
    	{
    		free(res[i]);
    		i++;
    	}
    	free(res);
    	return (NULL);
    }
    
    unsigned int	ft_word_cnt(char const *str, char c)
    {
    	unsigned int	cnt;
    
    	cnt = 0;
    	while (*str)
    	{
    		if (*str++ == c)
    			continue ;
    		++cnt;
    		while (*str && *str != c)
    			++str;
    	}
    	return (cnt);
    }
    
    void	ft_strcpy(char *dst, char *from, char const *until)
    {
    	while (from < until)
    		*(dst++) = *(from++);
    	*dst = '\0';
    }
    
    char	**ft_split_alloc(char const	*str, char	c)
    {
    	if (!str)
    		return (NULL);
    	return ((char **)malloc(sizeof(char *) * (ft_word_cnt(str, c) + 1)));
    }
    
    char	**ft_split(char const *str, char c)
    {
    	        char	**res;
    	unsigned int	i;
    	        char	*from;
    
    	res = ft_split_alloc(str, c);
    	if (!res)
    		return (NULL);
    	i = 0;
    	while (*str)
    	{
    		if (*str++ == c)
    			continue ;
    		from = (char *)str - 1;
    		while (*str && *str != c)
    			str++;
    		res[i] = (char *)malloc(sizeof(char) * (str - from + 1));
    		if (!(res[i]))
    			return (ft_free(res));
    		ft_strcpy(res[i++], from, str);
    	}
    	res[i] = NULL;
    	return (res);
    }

    ft_itoa


    数値を受け入れて文字列として表す関数.
    malloc(3)を使用してメモリを割り当てると、パラメータとして受信した整数を表す文字列が返されます.負の値を無条件に処理する必要があります.
    エラー原因:intの最小値-23ㅇを処理しない
    #include"libft.h"
    
    int	get_divisor(int	n, int	*size)
    {
    	         int	divisor;
    	unsigned int	nbr;
    
    	*size = 1;
    	if (n < 0)
    	{
    		++*size;
    		nbr = -n;
    	}
    	else
    		nbr = n;
    	divisor = 1;
    	while (nbr >= 10)
    	{
    		nbr /= 10;
    		divisor *= 10;
    		++*size;
    	}
    	return (divisor);
    }
    
    char	*ft_itoa(int	n)
    {
    	unsigned int	nbr;
    	         int	divisor;
    	         int	size;
    	        char	*res;
    
    	divisor = get_divisor(n, &size);
    	res = (char *)malloc(sizeof(char) * (size + 1));
    	if (!res)
    		return (NULL);
    	size = 0;
    	nbr = n;
    	if (n < 0)
    	{
    		res[size++] = '-';
    		nbr = -n;
    	}
    	while (divisor > 0)
    	{
    		res[size++] = nbr / divisor + '0';
    		nbr %= divisor;
    		divisor /= 10;
    	}
    	res[size] = '\0';
    	return (res);
    }

    ft_strmapi


    char ft_strmapi(char const s, char (*f)(unsigned int, char))ft_strmapiは文字列です  s  함수 fに適用  새로운 문자열を生成して返される関数.
    文字列「s」の各文字を巡回し、関数「f」を適用し、その文字のインデックスを関数「f」の最初のパラメータとして使用します.各文字に新しい適用関数文字列を作成します(malloc(3)を使用してメモリを割り当てます)
    #include"libft.h"
    
    char	*ft_strmapi(char const	*s, char	(*f)(unsigned int, char))
    {
    	char	*res;
    	size_t	i;
    	size_t	len;
    
    	if (!s)
    		return (NULL);
    	len = ft_strlen(s);
    	res = (char *)malloc(sizeof(char) * (len + 1));
    	if (!res)
    		return (NULL);
    	i = 0;
    	while (s[i])
    	{
    		res[i] = (*f)(i, s[i]);
    		i++;
    	}
    	res[i] = 0;
    	return (res);
    }

    ft_striteri


    void ft_striteri(char s, void (f)(unsigned int, char*))
    文字列「s」の各文字を巡回し、関数「f」を適用し、その文字のインデックスを関数「f」の最初のパラメータとして使用します.また、各文字のアドレス値は、関数「f」の2番目のパラメータとして使用され、場合によっては変更することができる.
    #include"libft.h"
    
    void	ft_striteri(char	*s, void	(*f)(unsigned int, char*))
    {
    	int	i;
    
    	if (!s)
    		return ;
    	i = 0;
    	while (*s)
    	{
    		(*f)(i, s);
    		 s++;
    		 i++;
    	}
    }

    ft_putchar_fd


    指定したファイル識別子に「c」という文字を出力します.
  • ファイルディスクロケータの整数値は、0ではなく(Non-negative Integer)です.
  • プロセスが実行中にファイルを開くと、カーネルはそのプロセスにファイルディスクバッチで使用されていない最小値を割り当てます.次に、システムコールを使用してプロセスを開くファイルにアクセスする場合、ファイルディスクバッチ(FD)値を使用してファイルを指定できます.
  • デフォルトで割り当てられたファイルディスク割り込み0:標準入力1:標準出力2:標準エラー
  • #include"libft.h"
    
    void	ft_putchar_fd(char	c, int	fd)
    {
    	if (fd < 0)
    		return ;
    	write (fd, &c, 1);
    }

    ft_putstr_fd


    void ft_putstr_fd(char *s, int fd)
    :文字列  sを指定されたファイルディスクスタンドに出力
    指定したファイル識別子に文字列「s」を出力します.
    #include"libft.h"
    
    void	ft_putstr_fd(char	*s, int	fd)
    {
    	if (!s || fd < 0)
    		return ;
    	write (fd, s, ft_strlen(s));
    }

    ft_putendl_fd


    文字列「s」を指定したファイル識別子に出力し、下りを出力します.
    #include"libft.h"
    
    void	ft_putendl_fd(char	*s, int	fd)
    {
    	if (!s || fd < 0)
    		return ;
    	write (fd, s, ft_strlen(s));
    	write (fd, "\n", 1);
    }

    ft_putnbr_fd


    void ft_putnbr_fd(int n, int fd)
    指定したファイル識別子に整数「n」を出力します.
    #include"libft.h"
    
    void	ft_putnbr_fd(int	n, int	fd)
    {
    	unsigned int	nbr;
    
    	nbr = n;
    	if (n < 0)
    	{
    		nbr = -n;
    		ft_putchar_fd('-', fd);
    	}
    	if (nbr >= 10)
    		ft_putnbr_fd(nbr / 10, fd);
    	ft_putchar_fd((nbr % 10) + '0', fd);
    }