0. Libft

zinnnn37·2022년 7월 22일
0

42 SEOUL

목록 보기
1/9

0.0. Makefile

  1. 내장 변수 $(MAKECMDGOALS)
    : make 이하의 텍스트를 담고 있다.
    e.g. make bonus를 입력하는 경우 bonus를 담는다.

  2. 내장 함수 filter
    : filter(pattern..., text)의 형태로 사용되며, text 내부에 pattern 단어들과 일치하는 문자열이 존재하는 경우 해당 문자열을 반환한다.

⚠️ piscine때와는 다르게 컴파일을 cc로 한다 ⚠️
✅ 위 두 가지를 활용한다면 bonus relink를 방지할 수 있다.


0.1. part 1 - Libc functions

0.1.1 isalpha

	int ft_isalpha(int c);
  • c가 알파벳인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다.

0.1.2. isdigit

	int ft_isdigit(int c);
  • 매개변수로 입력받은 문자가 숫자인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다.

0.1.3. isalnum

	int ft_isalnum(int c);
  • c가 알파벳 혹은 숫자인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다.

0.1.4. isascii

	int ft_isascii(int c);
  • c가 ASCII 문자인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다.

0.1.5. isprint

	int ft_isprint(int c);
  • c가 출력 가능한 문자인지 확인하는 함수로, 참이면 1, 거짓이면 0을 반환한다.

0.1.6. bzero

	void ft_bzero(void *s, size_t n);
  • sn만큼 0으로 설정한다.

0.1.7. memchr

	void *ft_memchr(const void *s, int c, size_t n);
  • s의 처음 n만큼의 길이 내에서 문자 c가 가장 먼저 나오는 주소값을 반환한다. 만약 찾지 못한다면 NULL을 반환한다.

0.1.8. memcmp

	int ft_memcmp(const void *s1, const void *s2, size_t n);
  • s1s2n만큼 비교한다. 만약 길이 n 이내에 다른 문자가 나온다면 두 문자의 차를, 모두 같다면 0을 반환한다. s1이 크다면 양수가, s2가 크다면 음수가 반환된다.

0.1.9. memcpy

	void *ft_memcpy(void *dst, const void *src, size_t n);
  • src의 내용을 dstn만큼 복사하는 함수로, 반환값은 dst 첫 문자의 주소이다.

0.1.10. memmove

	void *ft_memmove(void *dst, const void *src, size_t len);
  • src의 내용을 dstn만큼 복사하는 함수로, 반환값은 dst 첫 문자의 주소이다. 구현에 있어서 memcpy와 다른 점은 overlap을 주의하여야 한다는 점이다.

dst의 주소가 src의 주소보다 앞에 위치하는 경우에는 처음부터 복사를 진행해도 문제의 소지가 없다. 그러나 반대의 경우에는 src의 내용이 dst의 내용으로 바뀔 수 있기 때문에(overlap) 맨 마지막 문자부터 거꾸로 복사를 진행토록 해야 한다.
이는 memcpy는 메모리를 직접 복사하고, memmove는 임시 공간에 저장한 후 판단하여 다시 복사하기 때문이다. 따라서 memcpy는 속도가 빠르고 memmove는 안정성이 높다.

0.1.11. memset

	void *ft_memset(void *b, int c, size_t len);
  • bn만큼 c로 설정하는 함수로 반환값은 b의 첫 문자 주소이다.

⚠️ 메모리함수(mem*)들은 자료형과 관련 없이 byte단위로 확인하기 때문에 적절하게 형변환을 해야 한다 ⚠️

0.1.12. strlen

	size_t ft_strlen(const char *s);
  • 문자열 s의 길이를 반환한다.

0.1.13. strchr

	char *ft_strchr(const char *s, int c);
  • 문자열 s에서 가장 처음 나타난 문자 c의 주소를 반환한다. 만약 c가 존재하지 않는다면 NULL을 반환한다.

0.1.14. strrchr

	char *ft_strrchr(const char *s, int c);
  • 문자열 s에서 가장 마지막에 나타난 문자 c의 주소를 반환한다. 만약 c가 존재하지 않는다면 NULL을 반환한다.

0.1.15. strncmp

	int ft_strncmp(const char *s1, const char *s2, size_t n);
  • 문자열 s1과 문자열 s2n만큼 비교한다. 다른 문자를 발견한다면 해당하는 두 문자의 차를 반환한다. s1이 큰 경우 양수, s2가 큰 경우 음수가 반환된다. 길이 n 이내에 다른 문자가 없다면 0을 반환한다.

0.1.16. strlcpy

	size_t ft_strlcpy(char *dst, const char *src, size_t destsize);
  • 문자열 src의 내용을 문자열 dstdestsize만큼 복사하는 함수로, 마지막에 '\0'를 붙여주어야 한다. 반환값은 src의 길이이다.

0.1.17. strlcat

	size_t ft_strlcat(char *dst, const char *src, size_t destsize);
  • 문자열 src를 문자열 dst의 뒤에 이어붙이는 함수로, 마지막에 '\0'을 붙여주어야 한다. 만약 destsizedst의 길이보다 작거나 같다면 이어붙일 수 없으므로 복사를 진행하지 않고 destsize + src의 길이를 반환한다. 그렇지 않은 경우는 복사를 진행한 후 dst의 길이 + src의 길이를 반환한다.

0.1.18. strnstr

	char *ft_strnstr(const char *haystack, const char *needle, size_t len);
  • 문자열 haystacklen 이내에 needle과 같은 부문자열이 존재하는 경우 해당 부문자열의 주소를 반환한다. 만약 일치하는 부문자열이 없는 경우 NULL을 반환하고, needle이 빈 문자열인 경우 haystack의 주소를 반환한다.

    haystackNULL인 경우, needleNULL인 경우, 둘 다 NULL인 경우, 그리고 len0일 때와 아닌 경우를 모두 고려하여 코드를 작성할 필요가 있다.

0.1.19. toupper

	int ft_toupper(int c);
  • c가 소문자인 경우 대문자로 변환하여 반환한다.

0.1.20. tolower

	int ft_tolower(int c);
  • c가 대문자인 경우 소문자로 변환하여 반환한다.

0.1.21. atoi

	int ft_atoi(const char *str);
  • 문자열 str정수형으로 변환한 값을 반환한다.

⚠️ 정수형 최소값을 다룰 때 언더플로우를 주의하자 ⚠️
⚠️ piscine때 과제로 제출한 atoi와는 다르다 ⚠️

0.1.22. calloc

	void *ft_calloc(size_t count, size_t size);
  • size 크기의 메모리를 count개 만큼 동적할당한 후 그 배열의 주소를 반환한다. malloc과 다르게 할당된 영역이 모두 0으로 초기화된다. 할당을 실패하는 경우 NULL을 반환한다.

0.1.23. strdup

	char *ft_strdup(const char *s);
  • 문자열 s를 다른 메모리 영역으로 복사하여 복사한 메모리의 주소를 반환한다.

⚠️ 문자열의 끝에는 항상 '\0'이 붙는다 ⚠️


0.2. Part 2 - Additional functions

c library에는 없는 함수 구현

0.2.1. substr

	char *ft_substr(char const *s, unsigned int start, size len);
  • s[start]부터 len만큼의 부문자열을 생성하여 그 주소를 반환한다. starts의 길이보다 큰 값이라면 빈 문자열을 반환한다.

✅ 불필요한 메모리를 할당하지 않게 코드를 작성해보자(비록 Moulinette 은 잡지 않지만).

0.2.2. strjoin

	char *ft_strjoin(char const *s1. char const *s2);
  • 문자열 s1과 문자열 s2를 이어붙인 새로운 문자열을 생성하여 반환한다.

0.2.3. strtrim

	char *ft_strtrim(char const *s1, char const *set);
  • s1의 양 끝에 달려있는 set에 포함된 문자들을 제거한 문자열을 생성하여 반환한다. 모든 문자가 set에 포함되어있는 경우나 빈 문자열일 경우 빈 문자열을 반환한다.

⚠️ 중간에 있는 set 내부 문자는 신경쓰지 않아도 된다 ⚠️

0.2.4. split

	char **ft_split(char const *s, char c);
  • 구분자 c를 기준으로 문자열 s를 분할하여 그 결과를 담은 배열을 반환한다. 문자열 배열의 끝은 NULL로 끝나야 한다. 문자열을 저장하는 배열이기 때문에 char ** 함수이다.

⚠️ 마지막의 '\0'를 확인하지 않아 heap buffer overflow가 발생하기 쉽다 ⚠️

0.2.5. itoa

	char *ft_itoa(int n);
  • 정수 n을 문자 배열로 변환하여 반환한다.

⚠️ 정수형 최소값을 다룰 때 언더플로우를 주의하자 ⚠️

0.2.6. strmapi

	char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
  • 문자열 s를 함수 f에 적용하여 새로운 문자열을 생성하여 반환한다. f의 첫 번째 인자는 문자의 인덱스이고, 두 번째 인자는 해당하는 인덱스가 가리키는 문자열 s의 문자이다. 즉, f(i, s[i])의 형태이다.

0.2.7. striteri

	void ft_striteri(char *s, void (*f)(unsigned int, char *));
  • 문자열 s를 함수 f에 적용한다. f의 첫 번째 인자는 문자의 인덱스이고, 두 번째 인자는 해당하는 인덱스가 가리키는 문자열 s의 문자이다. 즉, f(i, s[i])의 형태이다.

ft_strmapi의 반환값은 char *이고, ft_striteri의 반환값은 void이다.

0.2.8. putchar_fd

	void ft_putchar_fd(char c, int fd);
  • 파일디스크립터 fd에 문자 c를 출력한다.

0.2.9. putstr_fd

	void ft_putstr_fd(char *s, int fd);
  • 파일디스크립터 fd에 문자열 s를 출력한다.

0.2.10. putendl_fd

	void ft_putendl_fd(char *s, int fd);
  • 파일디스크립터 fd에 문자열 s를 출력한 후 '\n'을 출력한다.

0.2.11. putnbr_fd

	void ft_putnbr_fd(int n, int fd);
  • 파일디스크립터 fd에 정수 n을 출력한다.

    ⚠️ 사용 가능한 외부 함수에 malloc이 없기 때문에 ft_itoa를 활용할 수 없다 ⚠️


0.3. Part 3 - Bonus Part

연결리스트를 다루는 함수로 구성된다.

libft.h 헤더에 다음과 같은 구조체를 선언해야 한다.

typedef struct	s_list
{
	void			*content;
    struct s_list	*next;
}	t_list;

content는 노드에 포함된 데이터로, 자료형이 void *이기 때문에 어떤 자료형의 값도 담을 수 있다. next는 다음 노드의 주소값을 담는다. 마지막 노드의 경우 NULL을 가리킨다.

0.3.1. lstnew

	t_list *ft_lstnew(void *content);
  • 새로운 노드를 생성하여 반환한다. 생성되는 노드의 content는 매개변수로 받은 content로 초기화하고, nextNULL로 초기화한다.

0.3.2. lstadd_front

	void ft_lstadd_front(t_list **lst, t_list *new);
  • 노드 newlst의 맨 앞에 추가한다.

⚠️ 연결리스트가 존재하지 않을 때, 연결리스트가 비었을 때 등의 케이스를 다룰 수 있어야 한다 ⚠️

0.3.3. lstadd_back

	void ft_lstadd_back(t_list **lst, t_list *new);
  • 노드 newlst의 맨 뒤에 추가한다.

0.3.4. lstsize

	int	ft_lstsize(t_list *lst);
  • lst에 포함된 노드의 개수를 반환한다.

0.3.5. lstlast

	t_list *ft_lstlast(t_list *lst);
  • lst의 맨 마지막 노드를 반환한다.

0.3.6. lstdelone

	void ft_lstdelone(t_list *lst, void (*del)(void *));
  • 노드 lst를 삭제한다. del함수를 활용하여 lstcontent를 해제하고, lst 자체의 메모리를 해제한다. next 포인터는 해제해서는 안 된다.

0.3.7. lstclear

	void ft_lstclear(t_list **lst, void (*del)(void *));
  • lst의 모든 노드를 삭제하고 해제한다. 함수 del은 노드의 content를 해제하는 함수이다. 리스트의 포인터는 NULL로 설정되어야 한다.

0.3.8. lstiter

	void ft_lstiter(t_list *lst, void (*f)(void *));
  • lst를 순회하며, lst에 포함된 노드의 content에 함수 f를 적용시킨다. 즉, 함수의 매개변수는 lst->content이다.

0.3.9. lstmap

	t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *));
  • lst를 순회하며, lst에 포함된 노드의 content에 함수 f를 적용시킨 후, 그 반환값으로 새로운 연결리스트를 생성한다. del 함수는 필요할 경우 각 요소의 content를 삭제하는 데 사용된다.

Moulinette 에서는 잡지 않지만 함수 f 내부에서 malloc이 쓰였을 경우에는 메모리를 어떻게 해제해야 할 지 생각해보자(Francinette 테스터기가 대신 잡아준다).

0개의 댓글