ํ๋ก์ ํธ ๋ชฉํ: ์์ผ๋ก ์ฌ์ฉํ ์ฌ๋ฌ ์ ์ฉํ ํจ์๋ค์ ์ง์ ๋ง๋ค๊ณ ๊ทธ๊ฒ๋ค์ด ๋ค์ด์๋ libft.a๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ
ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ: Makefile์ ์ฌ์ฉํ๋ ์ต์ํ all, clean, fclean, re ๊ท์น์ ํฌํจํด์ผ ํ๋ค. (bonus ๊ท์น๋ ํฌํจ)
Part 1 - Libc Functions
Libc(C ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ) ํจ์๋ค์ ์๋ณธ๊ณผ ๊ฐ์ ํ์์ ํ๋กํ ํ์ ์ผ๋ก ์ ์ธํ์ฌ ์ฌ๊ตฌํํด์ผ ํ๋ค. ์ด๋, ํจ์์ ์ด๋ฆ ์์๋ "ft_"๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
์ฌ๊ตฌํํ Libc ํจ์ ๋ฆฌ์คํธ
๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ํจ์: memset, bzero, memcpy, memccpy, memmove, memchr, memcmp, calloc
๋ฌธ์์ด ๊ด๋ จ ํจ์: strlen, strlcpy, strlcat, strchr, strrchr, strnstr, strncmp, atoi, strdup
๋ฌธ์ ๊ด๋ จ ํจ์: isalpha, isdigit, isalnum, isascii, isprint, toupper, tolower
โป์ด๋ฒ ๊ณผ์ ๋ฅผ ํ๋ฉด์ ์๋ก ์๊ฒ ๋ ๋ถ๋ถ๋ง ์ ๋ฆฌํ๋ ค๊ณ ํ๋คโป
1. ft_memset
void *ft_memset(void *b, int c, size_t len)
- memset์ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ์ํ๋ ํฌ๊ธฐ๋งํผ ํน์ ๊ฐ์ผ๋ก ์ค์ ํ๋ ๊ธฐ๋ฅ์ ํ๋ ํจ์์ด๋ค.
- void ํฌ์ธํฐํ์ ๋งค๊ฐ๋ณ์๋ ๋ค์ํ ์๋ฃํ์ ํฌ์ธํฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
- ์์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 1๋ฐ์ดํธ๋ก ์ชผ๊ฐ์ ๋ค๋ฃฐ ๋์๋ char๋ณด๋ค ๋ชจ๋ ๋นํธ๊ฐ value bit์ธ unsigned char๋ก ํ ๋ณํํ์ฌ ๋ค๋ฃจ๋ ๊ฒ์ด ์ข๋ค.
2. ft_bzero
void ft_bzero(void *s, size_t n)
- bzero๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ๋ชจ๋ 0์ผ๋ก ์ด๊ธฐํํ๋ ๊ธฐ๋ฅ์ ํ๋ ํจ์์ด๋ค.
3. ft_memcpy
void *ft_memcpy(void *dst, const void *src, size_t n)
- memcpy๋ src ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ dst ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก n ๋ฐ์ดํธ๋งํผ ๋ณต์ฌํ๊ณ dst๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ฅ์ ํ๋ ํจ์์ด๋ค.
- dst์ src์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ๊ฒน์น ์ ์๋๋ฐ memcpy๋ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ก ํด์ฃผ์ง๋ ์๋๋ค.
4. ft_memccpy
void *ft_memccpy(void *dst, const void *src, int c, size_t n)
- memccpy๋ src ๋ฐ์ดํฐ๋ฅผ dst์ ๋ณต์ฌํ ๋ src ๋ฐ์ดํฐ์ ํน์ ๋ฌธ์ c๊น์ง ๋ณต์ฌํ๋๋ฐ ์ด๋, c๋ฅผ ๋ง๋์ ๋ณต์ฌ๊ฐ ์ค๋จ๋์์ผ๋ฉด dst์ ๋ค์ ์ฃผ์๊ฐ์ ๋ฐํํ๊ณ ์ค๋จ์ด ๋์ง ์์๋ค๋ฉด NULL์ ๋ฐํํ๋ ํจ์์ด๋ค.
5. ft_memmove
void *ft_memmove(void *dst, const void *src, size_t len)
- memmove๋ memcpy์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ํจ์์ด๋ค. ํ์ง๋ง memcpy๋ dst์ src๊ฐ ๊ฒน์น๋ ๊ฒฝ์ฐ์๋ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ก ์ ํด์ฃผ๋ ๋ฐ๋ฉด, memmove๋ ๋ ์์ญ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
- src์ dst์ด ์๋ก ๊ฒน์น์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ๋ถํฐ ๋จผ์ ๋ณต์ฌํ๋๋ฐ ์ฝ๊ฒ ๋งํด์ dst๊ฐ src๋ณด๋ค ์์ ๋๋ ์์์๋ถํฐ ๋ณต์ฌํ์ง๋ง ํด๋๋ ๋ค์์๋ถํฐ ๋ณต์ฌํ๋ค.
6. ft_memchr
void *ft_memchr(const void *s, int c, size_t n)
- memchr์ s ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ํน์ ๋ฌธ์ c๊ฐ ์กด์ฌํ๋ฉด ๊ทธ ๋ถ๋ถ์ฃผ์ ๊ฐ์๋ฐํ์ ํ๊ณ ์กด์ฌํ์ง ์๋๋ค๋ฉด NULL์ ๋ฐํํ๋ ํจ์์ด๋ค.
7. ft_strchr๊ณผ ft_strrchr
char *strchr(const char *s, int c)
char *strrchr(const char *s, int c)
- strchr์ ๋ฌธ์์ด s์์ ๊ฐ์ฅ ๋จผ์ ์์นํ ํน์ ๋ฌธ์ c์ ์ฃผ์๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ค.
- strrchr์ ๋ฌธ์์ด s์์ ๊ฐ์ฅ ๋์ค์ ์์นํ ํน์ ๋ฌธ์ c์ ์ฃผ์๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ค.
8. ft_calloc
void *calloc(size_t count, size_t size)
- size ํฌ๊ธฐ์ ๋ณ์๋ฅผ count๊ฐ๋งํผ ์ ์ฅํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ ๋นํ๋ ์ญํ ์ ํ๋ ํจ์์ด๋ค.
- ์ด๋ ํ ๋น๋ ๊ณต๊ฐ์ ๊ฐ์ ๋ชจ๋ 0์ผ๋ก ์ด๊ธฐํ๋์ด์๋ค.
Part 2 - Additional Functions
Libc์ ํฌํจ๋ผ์์ง ์๊ฑฐ๋ ๋ค๋ฅธ ํ๋กํ ํ์ ์ ์ธ ํ์์ผ๋ก ํฌํจ๋ ํจ์๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
Part 1์ Libc ํจ์๋ค์ man์ ๋ ๊ฐ๋์ ๋ํ ๋ถ๋ถ์ด ์ธ๊ธ์ด ์์ด ๋ ๊ฐ๋๋ฅผ ๊ตฌํํ์ง ์์์ง๋ง, Part 2๋ ๋ฐ๋ก ๋ฐ๋ผ์ผ ํ ๋ ํผ๋ฐ์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ๋๋ฅผ ๋ชจ๋ ํจ์์ ์ ์ฉ์์ผฐ๋ค. ๋ํ malloc ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด์ผ ํ๋ฏ๋ก ๋์ ํ ๋น์ ์คํจํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด์คฌ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง๊ธฐ ์ํด free ํจ์๋ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ์๋ค.
โป ๋ ๊ฐ๋(Null guard)๋?
ํจ์์ ์ธ์๋ก (void *) 0, ์ฆ ๋น ์ฃผ์ ๊ฐ์ด ๋ค์ด์ฌ ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ์ด๋ค.
1. ft_substr
char *ft_substr(char const *s, unsigned int start, size_t len)
ํจ์ ์ค๋ช : ๋ฌธ์์ด s์์ ํ์ ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์์ด๋ค. ๋ฐํํ ํ์ ๋ฌธ์์ด์ ์ต๋ ๊ธธ์ด๋ len์ด๊ณ ๋ฌธ์์ด s์ start ์ธ๋ฑ์ค๋ถํฐ ์์๋๋ค.
2. ft_strjoin
char *ft_strjoin(char const *s1, char const *s2)
ํจ์ ์ค๋ช : ๋ฌธ์์ด s1๊ณผ ๋ฌธ์์ด s2๊ฐ ํฉ์ณ์ง ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์์ด๋ค.
3. ft_strtrim
char *ft_strtrim(char const *s1, char const *set)
ํจ์ ์ค๋ช : ๋ฌธ์์ด s1์ ์ฒ์๊ณผ ๋์์ set์ ์ง์ ๋ ๋ฌธ์๋ค์ด ์กด์ฌํ๋ค๋ฉด ๊ทธ๊ฒ๋ค์ด ์ ๊ฑฐ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์์ด๋ค.
- Part 1์์ ๊ตฌํํ๋ ft_strchr ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋๋ฐ ์ฉ์ดํ๊ฒ ํ์๋ค.
4. ft_split
char **ft_split(char const *s, char c)
ํจ์ ์ค๋ช : ๊ตฌ๋ถ์ c๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด s์ ๋ถํ ํ์ฌ ์ป์ ์๋ก์ด ๋ฌธ์์ด ๋ฐฐ์ด์ ๋ฐํํ๋ ํจ์์ด๋ค. ์ด๋ ๋ฐฐ์ด์ NULL๋ก ๋๋์ผ ํ๋ค.
5. ft_itoa
char *ft_itoa(int n)
ํจ์ ์ค๋ช : atoi์ ๋ฐ๋๋ก ์ ์ n์ ๋ํ๋ด๋ ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์์ด๋ค. ์ด๋ ์์ ์ฒ๋ฆฌ๋ ํด์ค์ผ ํ๋ค.
6. ft_strmapi
char *ft_strmapi(char const *s, char (*f)(unsigned int, char))
ํจ์ ์ค๋ช : ๋ฌธ์์ด s์ ๊ฐ ๋ฌธ์์ fํจ์๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์ฉ์ํจ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์์ด๋ค.
7. ft_putchar_fd
void ft_putchar_fd(char c, int fd)
ํจ์ ์ค๋ช : ๋ฌธ์ c๋ฅผ ์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ์ถ๋ ฅํ๋ ํจ์์ด๋ค.
์๊ตฌ ์ฌํญ: unistd ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ write ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
8. ft_putstr_fd
void ft_putstr_fd(char *s, int fd)
ํจ์ ์ค๋ช : ๋ฌธ์์ด s๋ฅผ ์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ์ถ๋ ฅํ๋ ํจ์์ด๋ค.
์๊ตฌ ์ฌํญ: unistd ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ write ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
9. ft_putendl_fd
void ft_putendl_fd(char *s, int fd)
ํจ์ ์ค๋ช : ๋ฌธ์์ด s๋ฅผ ์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ์ถ๋ ฅํ๊ณ ๊ฐํ๊น์ง ํ๋ ํจ์์ด๋ค.
์๊ตฌ ์ฌํญ: unistd ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ write ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
10. ft_putnbr_fd
void ft_putnbr_fd(int n, int fd)
ํจ์ ์ค๋ช : ์ ์ >n์ ์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ์ถ๋ ฅํ๋ ํจ์์ด๋ค.
์๊ตฌ ์ฌํญ: unistd ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ write ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
Bonus Part
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
์์ ๊ฐ์ด ์ ์ธ๋ ๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ ธ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ค์ ๊ตฌํํด์ผ ํ๋ค.
1. ft_lstnew
t_list *ft_lstnew(void *content)
ํจ์ ์ค๋ช : ๋งค๊ฐ๋ณ์ content์ ๊ฐ์ content์ผ๋ก ๊ฐ์ง๊ณ next๋ NULL๋ก ์ด๊ธฐํ๋๋ ์๋ก์ด ์์๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
์๊ตฌ ์ฌํญ: malloc ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
2. ft_lstadd_front
void ft_lstadd_front(t_list **lst, t_list *new)
ํจ์ ์ค๋ช : ๋งค๊ฐ๋ณ์ lst๋ ์ฒซ ๋ฒ์งธ ๋งํฌ๋ ๋ฆฌ์คํธ์ ํฌ์ธํฐ ์ฃผ์์ด๊ณ new๋ ๋ฆฌ์คํธ์ ์ถ๊ฐ๋๊ธฐ ์ํ ์์์ ํฌ์ธํฐ ์ฃผ์์ด๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ์ ์์ ๋ถ๋ถ์ ์์ new๋ฅผ ์ถ๊ฐํ๋ ํจ์์ด๋ค.
3. ft_lstsize
int ft_lstsize(t_list *lst)
ํจ์ ์ค๋ช : lst๋ ๋ฆฌ์คํธ์ ์์ ์ฃผ์์ด๋ค. ํ์ฌ ๋งํฌ๋ ๋ฆฌ์คํธ์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
4. ft_lstlast
t_list *ft_lstlast(t_list *lst)
ํจ์ ์ค๋ช : lst๋ ๋ฆฌ์คํธ์ ์์ ์ฃผ์์ด๋ค. ํ์ฌ ๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ์์๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
5. ft_lstadd_back
void ft_lstadd_back(t_list **lst, t_list *new)
ํจ์ ์ค๋ช : ๋งค๊ฐ๋ณ์ lst๋ ์ฒซ ๋ฒ์งธ ๋งํฌ๋ ๋ฆฌ์คํธ์ ํฌ์ธํฐ ์ฃผ์์ด๊ณ new๋ ๋ฆฌ์คํธ์ ์ถ๊ฐ ๋๊ธฐ ์ํ ์์์ ํฌ์ธํฐ ์ฃผ์์ด๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๋ถ๋ถ์ new๋ฅผ ์ถ๊ฐํ๋ ํจ์์ด๋ค.
6. ft_lstdelone
void ft_lstdelone(t_list *lst, void (*del)(void *))
ํจ์ ์ค๋ช : lst๋ free๋ฅผ ํด์ค ์์์ ์ฃผ์์ด๊ณ del์ ์์์ content๋ฅผ ์ญ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํจ์์ ์ฃผ์์ด๋ค. ํด๋น ์์์ content๋ฅผ ์ญ์ ํ๋ del ํจ์๋ฅผ ์ ์ฉํ๊ณ ํด๋น ์์๋ฅผ freeํด์ฃผ๋ ํจ์์ด๋ค.
์๊ตฌ ์ฌํญ: free ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
7. ft_lstclear
void ft_lstclear(t_list **lst, void (*del)(void *))
ํจ์ ์ค๋ช : ๋งค๊ฐ๋ณ์ lst๋ ์์์ ํฌ์ธํฐ ์ฃผ์์ด๊ณ del์ ์์ content๋ฅผ ์ญ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํจ์์ ์ฃผ์์ด๋ค. ํด๋น ์์์ content๋ฅผ ์ญ์ ํ๋ del ํจ์๋ฅผ ์ ์ฉํ๊ณ ํด๋น ์์๋ฅผ freeํด์ฃผ๊ณ ์ด ์์ ์ ๋ชจ๋ ํ์ ์์์๋ ์ ์ฉ์ํค๋ ํจ์์ด๋ค.
์๊ตฌ ์ฌํญ: free ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
8. ft_lstiter
void ft_lstiter(t_list *lst, void (*f)(void *))
ํจ์ ์ค๋ช : ๋งค๊ฐ๋ณ์ lst๋ ์์์ ํฌ์ธํฐ ์ฃผ์์ด๊ณ f๋ ๋ฆฌ์คํธ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจ์์ ์ฃผ์์ด๋ค. ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ฐ ์์์ content์ ํจ์ f๋ฅผ ์ ์ฉ์ํค๋ ํจ์์ด๋ค.
9. ft_lstmap
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
ํจ์ ์ค๋ช : ๋งค๊ฐ๋ณ์ lst๋ ์์์ ํฌ์ธํฐ ์ฃผ์, f๋ ๋ฆฌ์คํธ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจ์์ ์ฃผ์์ด๊ณ del์ ์์์ content๋ฅผ ์ญ์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ํจ์์ ์ฃผ์์ด๋ค. ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ฐ ์์์ content์ ํจ์ f๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์ฉ์์ผ ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ํจ์์ด๋ค. ์ด๋ ๋์ ํ ๋น์ ์คํจํ์ ๊ฒฝ์ฐ์ del ํจ์๋ฅผ ์ด์ฉํด ๋ชจ๋ ์์๋ฅผ ์ญ์ ํด์ผ ํ๋ค.
์๊ตฌ ์ฌํญ: malloc๊ณผ free ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๋๊ธ