내장 변수 $(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 테스터기가 대신 잡아준다).