내장 변수 $(MAKECMDGOALS)
: make
이하의 텍스트를 담고 있다.
e.g. make bonus
를 입력하는 경우 bonus
를 담는다.
내장 함수 filter
: filter(pattern..., text)
의 형태로 사용되며, text
내부에 pattern
단어들과 일치하는 문자열이 존재하는 경우 해당 문자열을 반환한다.
⚠️ piscine때와는 다르게 컴파일을
cc
로 한다 ⚠️
✅ 위 두 가지를 활용한다면 bonus relink를 방지할 수 있다.
int ft_isalpha(int c);
c
가 알파벳인지 확인하는 함수로, 참이면 1
, 거짓이면 0
을 반환한다. int ft_isdigit(int c);
int ft_isalnum(int c);
c
가 알파벳 혹은 숫자인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다. int ft_isascii(int c);
c
가 ASCII 문자인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다. int ft_isprint(int c);
c
가 출력 가능한 문자인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다. void ft_bzero(void *s, size_t n);
s
를 n
만큼 0
으로 설정한다. void *ft_memchr(const void *s, int c, size_t n);
s
의 처음 n
만큼의 길이 내에서 문자 c
가 가장 먼저 나오는 주소값
을 반환한다. 만약 찾지 못한다면 NULL
을 반환한다. int ft_memcmp(const void *s1, const void *s2, size_t n);
s1
과 s2
를 n
만큼 비교한다. 만약 길이 n
이내에 다른 문자가 나온다면 두 문자의 차를, 모두 같다면 0
을 반환한다. s1
이 크다면 양수가, s2
가 크다면 음수가 반환된다. void *ft_memcpy(void *dst, const void *src, size_t n);
src
의 내용을 dst
에 n
만큼 복사하는 함수로, 반환값은 dst 첫 문자의 주소
이다. void *ft_memmove(void *dst, const void *src, size_t len);
src
의 내용을 dst
에 n
만큼 복사하는 함수로, 반환값은 dst
첫 문자의 주소이다. 구현에 있어서 memcpy
와 다른 점은 overlap을 주의하여야 한다는 점이다.dst의 주소가 src의 주소보다 앞에 위치하는 경우에는 처음부터 복사를 진행해도 문제의 소지가 없다. 그러나 반대의 경우에는 src의 내용이 dst의 내용으로 바뀔 수 있기 때문에(overlap) 맨 마지막 문자부터 거꾸로 복사를 진행토록 해야 한다.
이는 memcpy는 메모리를 직접 복사하고, memmove는 임시 공간에 저장한 후 판단하여 다시 복사하기 때문이다. 따라서 memcpy는 속도가 빠르고 memmove는 안정성이 높다.
void *ft_memset(void *b, int c, size_t len);
b
를 n
만큼 c
로 설정하는 함수로 반환값은 b의 첫 문자 주소
이다.⚠️ 메모리함수(mem*)들은 자료형과 관련 없이
byte단위
로 확인하기 때문에 적절하게 형변환을 해야 한다 ⚠️
size_t ft_strlen(const char *s);
s
의 길이를 반환한다. char *ft_strchr(const char *s, int c);
s
에서 가장 처음 나타난 문자 c
의 주소를 반환한다. 만약 c
가 존재하지 않는다면 NULL
을 반환한다. char *ft_strrchr(const char *s, int c);
s
에서 가장 마지막에 나타난 문자 c
의 주소를 반환한다. 만약 c
가 존재하지 않는다면 NULL
을 반환한다. int ft_strncmp(const char *s1, const char *s2, size_t n);
s1
과 문자열 s2
를 n
만큼 비교한다. 다른 문자를 발견한다면 해당하는 두 문자의 차를 반환한다. s1
이 큰 경우 양수, s2
가 큰 경우 음수가 반환된다. 길이 n
이내에 다른 문자가 없다면 0
을 반환한다. size_t ft_strlcpy(char *dst, const char *src, size_t destsize);
src
의 내용을 문자열 dst
에 destsize
만큼 복사하는 함수로, 마지막에 '\0'
를 붙여주어야 한다. 반환값은 src
의 길이이다. size_t ft_strlcat(char *dst, const char *src, size_t destsize);
src
를 문자열 dst
의 뒤에 이어붙이는 함수로, 마지막에 '\0'
을 붙여주어야 한다. 만약 destsize
가 dst
의 길이보다 작거나 같다면 이어붙일 수 없으므로 복사를 진행하지 않고 destsize + src의 길이
를 반환한다. 그렇지 않은 경우는 복사를 진행한 후 dst의 길이 + src의 길이
를 반환한다. char *ft_strnstr(const char *haystack, const char *needle, size_t len);
haystack
이 len
이내에 needle
과 같은 부문자열이 존재하는 경우 해당 부문자열의 주소를 반환한다. 만약 일치하는 부문자열이 없는 경우 NULL
을 반환하고, needle
이 빈 문자열인 경우 haystack
의 주소를 반환한다.
haystack
이NULL
인 경우,needle
이NULL
인 경우, 둘 다NULL
인 경우, 그리고len
이0
일 때와 아닌 경우를 모두 고려하여 코드를 작성할 필요가 있다.
int ft_toupper(int c);
c
가 소문자인 경우 대문자로 변환하여 반환한다. int ft_tolower(int c);
c
가 대문자인 경우 소문자로 변환하여 반환한다. int ft_atoi(const char *str);
str
을 정수형
으로 변환한 값을 반환한다.⚠️ 정수형 최소값을 다룰 때 언더플로우를 주의하자 ⚠️
⚠️ piscine때 과제로 제출한 atoi와는 다르다 ⚠️
void *ft_calloc(size_t count, size_t size);
size
크기의 메모리를 count
개 만큼 동적할당한 후 그 배열의 주소를 반환한다. malloc
과 다르게 할당된 영역이 모두 0
으로 초기화된다. 할당을 실패하는 경우 NULL
을 반환한다. char *ft_strdup(const char *s);
s
를 다른 메모리 영역으로 복사하여 복사한 메모리의 주소를 반환한다.⚠️ 문자열의 끝에는 항상
'\0'
이 붙는다 ⚠️
c library에는 없는 함수 구현
char *ft_substr(char const *s, unsigned int start, size len);
s[start]
부터 len
만큼의 부문자열을 생성하여 그 주소를 반환한다. start
가 s
의 길이보다 큰 값이라면 빈 문자열을 반환한다.✅ 불필요한 메모리를 할당하지 않게 코드를 작성해보자(비록 Moulinette 은 잡지 않지만).
char *ft_strjoin(char const *s1. char const *s2);
s1
과 문자열 s2
를 이어붙인 새로운 문자열을 생성하여 반환한다. char *ft_strtrim(char const *s1, char const *set);
s1
의 양 끝에 달려있는 set
에 포함된 문자들을 제거한 문자열을 생성하여 반환한다. 모든 문자가 set
에 포함되어있는 경우나 빈 문자열일 경우 빈 문자열을 반환한다.⚠️ 중간에 있는
set
내부 문자는 신경쓰지 않아도 된다 ⚠️
char **ft_split(char const *s, char c);
c
를 기준으로 문자열 s
를 분할하여 그 결과를 담은 배열을 반환한다. 문자열 배열의 끝은 NULL
로 끝나야 한다. 문자열을 저장하는 배열이기 때문에 char **
함수이다.⚠️ 마지막의
'\0'
를 확인하지 않아heap buffer overflow
가 발생하기 쉽다 ⚠️
char *ft_itoa(int n);
n
을 문자 배열로 변환하여 반환한다.⚠️ 정수형 최소값을 다룰 때 언더플로우를 주의하자 ⚠️
char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
s
를 함수 f
에 적용하여 새로운 문자열을 생성하여 반환한다. f
의 첫 번째 인자는 문자의 인덱스이고, 두 번째 인자는 해당하는 인덱스가 가리키는 문자열 s
의 문자이다. 즉, f(i, s[i])
의 형태이다. void ft_striteri(char *s, void (*f)(unsigned int, char *));
s
를 함수 f
에 적용한다. f
의 첫 번째 인자는 문자의 인덱스이고, 두 번째 인자는 해당하는 인덱스가 가리키는 문자열 s
의 문자이다. 즉, f(i, s[i])
의 형태이다.✅
ft_strmapi
의 반환값은char *
이고,ft_striteri
의 반환값은void
이다.
void ft_putchar_fd(char c, int fd);
fd
에 문자 c
를 출력한다. void ft_putstr_fd(char *s, int fd);
fd
에 문자열 s
를 출력한다. void ft_putendl_fd(char *s, int fd);
fd
에 문자열 s
를 출력한 후 '\n'
을 출력한다. void ft_putnbr_fd(int n, int fd);
fd
에 정수 n
을 출력한다.⚠️ 사용 가능한 외부 함수에
malloc
이 없기 때문에ft_itoa
를 활용할 수 없다 ⚠️
연결리스트
를 다루는 함수로 구성된다.
libft.h
헤더에 다음과 같은 구조체를 선언해야 한다.typedef struct s_list { void *content; struct s_list *next; } t_list;
content
는 노드에 포함된 데이터로, 자료형이void *
이기 때문에 어떤 자료형의 값도 담을 수 있다.next
는 다음 노드의 주소값을 담는다. 마지막 노드의 경우NULL
을 가리킨다.
t_list *ft_lstnew(void *content);
content
는 매개변수로 받은 content
로 초기화하고, next
는 NULL
로 초기화한다. void ft_lstadd_front(t_list **lst, t_list *new);
new
를 lst
의 맨 앞에 추가한다.⚠️ 연결리스트가 존재하지 않을 때, 연결리스트가 비었을 때 등의 케이스를 다룰 수 있어야 한다 ⚠️
void ft_lstadd_back(t_list **lst, t_list *new);
new
를 lst
의 맨 뒤에 추가한다. int ft_lstsize(t_list *lst);
lst
에 포함된 노드의 개수를 반환한다. t_list *ft_lstlast(t_list *lst);
lst
의 맨 마지막 노드를 반환한다. void ft_lstdelone(t_list *lst, void (*del)(void *));
lst
를 삭제한다. del
함수를 활용하여 lst
의 content
를 해제하고, lst
자체의 메모리를 해제한다. next
포인터는 해제해서는 안 된다. void ft_lstclear(t_list **lst, void (*del)(void *));
lst
의 모든 노드를 삭제하고 해제한다. 함수 del
은 노드의 content
를 해제하는 함수이다. 리스트의 포인터는 NULL
로 설정되어야 한다. void ft_lstiter(t_list *lst, void (*f)(void *));
lst
를 순회하며, lst
에 포함된 노드의 content
에 함수 f
를 적용시킨다. 즉, 함수의 매개변수는 lst->content
이다. t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *));
lst
를 순회하며, lst
에 포함된 노드의 content
에 함수 f
를 적용시킨 후, 그 반환값으로 새로운 연결리스트를 생성한다. del
함수는 필요할 경우 각 요소의 content
를 삭제하는 데 사용된다.✅ Moulinette 에서는 잡지 않지만 함수
f
내부에서malloc
이 쓰였을 경우에는 메모리를 어떻게 해제해야 할 지 생각해보자(Francinette 테스터기가 대신 잡아준다).