Libft part2
ft_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」という文字を出力します.
(Non-negative Integer)
です.#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);
}
Reference
この問題について(Libft part2), 我々は、より多くの情報をここで見つけました https://velog.io/@wldus24/Libft-part2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol