https://modoocode.com/311
https://devanix.tistory.com/195 (ar
명령)
gcc -Wall -Werror -Wextra -o test *.c -L. -lft
bonus
규칙의 relink를 방지하기 위해 WITH_BONUS
라는 변수를 플래그로 사용한다.memset
https://devdocs.io/c/string/byte/memset
void *ft_memset(void *b, int c, size_t len);
b
에 c
를 len
바이트 만큼 쓰는 함수c
는 unsigned char
로 변환된다.b
를 리턴한다.bzero
void ft_bzero(void *s, size_t n);
s
에 0을 n
바이트 만큼 쓰는 함수memcpy
void *ft_memcpy(void *dst, const void *src, size_t n);
dst
에 src
를 n
바이트만큼 복사하는 함수dst
와 src
모두 unsigned char
로 해석된다.dst
를 리턴한다.memccpy
https://en.cppreference.com/w/c/string/byte/memccpy
void *ft_memccpy(void *dst, const void *src, int c, size_t n);
dst
에 src
를 n
바이트만큼 복사src
에서 c
까지 복사하고 그 다음 dst
의 주소를 반환한다.c
를 만나지 않고 n
바이트가 모두 복사되었다면 NULL
포인터를 반환한다.c
는 unsigned char
로 변환된다.memmove
https://devdocs.io/c/string/byte/memmove
void *ft_memmove(void *dst, const void *src, size_t len);
dst
에 src
를 len
만큼 복사dst
와 src
모두 unsigned char
로 해석된다.dst
를 반환한다.src
가 dst
보다 작은 경우 overlap 현상이 발생할 수 있으므로, 뒤부터 복사한다.
memcpy
와memmove
의 차이👉 현재는
memcpy
의 overlap 문제도 해결된 상태지만 과거에는 아래와 같은 차이가 존재
memcpy
는 데이터를 바로 복사하고,memmove
는 임시 공간에 저장했다가 복사한다.memcpy
가 더 빠르고,memmove
가 더 안전하다.dst
와src
가 같은 주소를 참조할 때,memcpy
의 경우 겹침(overlap) 현상이 일어나서 예상치 못한 결과를 얻을 수 있다.- 참고
memchr
void *ft_memchr(const void *s, int c, size_t n);
s
의 n
만큼에서 c
가 나타나는 첫 번째 주소를 반환한다.c
가 없으면 NULL
포인터를 반환한다.c
는 unsigned char
로 변환된다.memcmp
int ft_memcmp(const void *s1, const void *s2, size_t n);
s1
과 s2
를 n
만큼 비교한다.unsigned char
값의 차이를 반환한다.strlen
size_t ft_strlen(const char *str)
size_t
형을 사용하려면 stddef.h
라이브러리를 포함해야 한다.strlcpy
size_t ft_strlcpy(char *dst, const char *src, size_t dstsize);
dst
에 src
를 dstsize - 1
만큼 복사src
의 길이를 리턴한다.dstsize
가 0이면 리턴strlcat
size_t ft_strlcat(char *dst, const char *src, size_t dstsize);
dst
에 src
를 dstsize - 처음 dst의 길이 - 1
만큼 붙여넣는다.처음 dst의 길이 + src의 길이
를 리턴한다.dstsize
가 0이거나 dst의 길이
보다 같거나 작으면 dstsize + src의 길이
를 리턴한다.strchr
char *ft_strchr(const char *s, int c);
s
에서 첫 번째 c
를 찾아서 그 위치를 반환한다.s
에 c
가 없는 경우 NULL
을 반환한다.unsigned char
로 해석한다.strrchr
char *ft_strrchr(const char *s, int c);
s
에서 마지막 c
를 찾아서 그 위치를 반환한다.s
에 c
가 없는 경우NULL
을 반환한다.unsigned char
로 해석한다.strnstr
char *strnstr(const char *big, const char *little, size_t len);
big
의 len
만큼 중에서 little
을 찾아서 그 위치를 반환한다.little
이 빈 문자열이면 big
을 반환한다.little
이 big
에 없으면 NULL
을 반환한다.strncmp
int ft_strncmp(const char *s1, const char *s2, size_t n);
s1
과 s2
를 n
만큼만 비교한다.atoi
int ft_atoi(const char *str);
str
을 int
형태로 변환하여 리턴한다.toupper
int ft_toupper(int c);
tolower
int ft_tolower(int c);
isalpha
int ft_isalpha(int c);
isupper
와 islower
를 모두 만족하는지 검사하는 함수
static 함수
- 정적 함수
- 해당 함수가 선언된 파일 내부에서만 사용할 수 있다.
- 참고
isdigit
int ft_isdigit(int c);
isalnum
int ft_isalnum(int c);
isascii
int ft_isascii(int c);
isprint
int ft_isprint(int c);
부터 ~
까지 (아스키코드 32부터 126까지)calloc
void *ft_calloc(size_t count, size_t size);
size
바이트를 count
개만큼 할당하고 0으로 초기화하는 함수NULL
포인터를 반환한다.strdup
char *ft_strdup(const char *s1);
s1
크기만큼 메모리를 동적으로 할당하고 복사하는 함수substr
char *ft_substr(char const *s, unsigned int start, size_t len);
s
를 start
번째 인덱스부터 최대 len
만큼 잘라서 새로운 문자열을 만들고 반환하는 함수len + 1
만큼 동적 할당한다.NULL
포인터를 반환한다.start
가 s
의 인덱스 범위를 넘어서면 빈 문자열을 반환한다.strjoin
char *ft_strjoin(char const *s1, char const *s2);
s1
과 s2
를 연결한 새로운 문자열을 반환한다.strtrim
char *ft_strtrim(char const *s1, char const *set);
s1
의 앞뒤에 있는 set
을 삭제한 새로운 문자열을 반환한다.set
은 문자의 모음으로, 각 문자가 기준이 된다.split
char **ft_split(char const *s, char c);
s
를 c
로 구분한 포인터 배열을 반환한다.char *
를 할당할지 먼저 구한다.char *
를 strdup
한다.free
한다.free
해야 한다.free
후에 포인터는 NULL
로 초기화하는 것이 좋다. (허상 포인터(dangling pointer))NULL
포인터로 표시한다.itoa
char *ft_itoa(int n);
n
을 문자열로 변환하여 반환한다.get_size
해서 동적 할당하고 부호별로 케이스를 나눠서 거꾸로 담는다.strmapi
char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
s
의 각 문자에 f
를 적용한 새로운 문자열을 반환한다.putchar_fd
void ft_putchar_fd(char c, int fd);
fd
)에 c
를 쓰는 함수putstr_fd
void ft_putstr_fd(char *s, int fd);
fd
)에 s
를 쓰는 함수putendl_fd
void ft_putendl_fd(char *s, int fd);
fd
)에 개행을 추가한 s
를 쓰는 함수putnbr_fd
void ft_putnbr_fd(int n, int fd);
fd
)에 n
를 쓰는 함수typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
lstnew
t_list *ft_lstnew(void *content);
t_list
를 만들어서 반환한다.content
는 매개 변수로 받은 content
로, next
에는 NULL
로 초기화한다.lstadd_front
void ft_lstadd_front(t_list **lst, t_list *new);
lst
의 맨 앞에 new
를 추가하는 함수lstsize
int ft_lstsize(t_list *lst);
lst
로 시작하는 리스트의 길이를 반환한다.lstlast
t_list *ft_lstlast(t_list *lst);
lst
로 시작하는 리스트의 가장 마지막 t_list
를 반환한다.lstadd_back
void ft_lstadd_back(t_list **lst, t_list *new);
lst
의 맨 뒤에 new
를 추가하는 함수lstdelone
void ft_lstdelone(t_list *lst, void (*del)(void *));
lst
의 content
을 del
로 free
한 다음 lst
를 free
하는 함수lstclear
void ft_lstclear(t_list **lst, void (*del)(void *));
lst
하위 노드의 content
를 del
로 free
한 다음 해당 노드도 free
하고, 최종적으로 lst
를 free
하는 함수lst
의 메모리가 해제되었다는 것을 알려주기 위해 *lst
에 NULL
을 할당한다.lstiter
void ft_lstiter(t_list *lst, void (*f)(void *));
lst
로 시작하는 리스트의 각 노드의 content
를 매개변수로 f
를 호출하는 함수lstmap
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *));
lst
로 시작하는 리스트의 각 노드의 content
에 f
를 적용한 새로운 리스트를 생성하는 함수del
로 노드를 삭제한다.result
)next
가 NULL
일 때까지 반복하면서 새로운 노드 생성하고 lstadd_back
으로 리스트 끝에 연결lstclear
로 모든 메모리 해제