https://modoocode.com/311
https://devanix.tistory.com/195 (ar 명령)
gcc -Wall -Werror -Wextra -o test *.c -L. -lft
bonus 규칙의 relink를 방지하기 위해 WITH_BONUS라는 변수를 플래그로 사용한다.memsethttps://devdocs.io/c/string/byte/memset
void *ft_memset(void *b, int c, size_t len);
b에 c를 len 바이트 만큼 쓰는 함수c는 unsigned char로 변환된다.b를 리턴한다.bzerovoid ft_bzero(void *s, size_t n);
s에 0을 n 바이트 만큼 쓰는 함수memcpyvoid *ft_memcpy(void *dst, const void *src, size_t n);
dst에 src를 n 바이트만큼 복사하는 함수dst와 src 모두 unsigned char로 해석된다.dst를 리턴한다.memccpyhttps://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로 변환된다.memmovehttps://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) 현상이 일어나서 예상치 못한 결과를 얻을 수 있다.- 참고
memchrvoid *ft_memchr(const void *s, int c, size_t n);
s의 n만큼에서 c가 나타나는 첫 번째 주소를 반환한다.c가 없으면 NULL 포인터를 반환한다.c는 unsigned char로 변환된다.memcmpint ft_memcmp(const void *s1, const void *s2, size_t n);
s1과 s2를 n만큼 비교한다.unsigned char 값의 차이를 반환한다.strlensize_t ft_strlen(const char *str)
size_t형을 사용하려면 stddef.h 라이브러리를 포함해야 한다.strlcpysize_t ft_strlcpy(char *dst, const char *src, size_t dstsize);
dst에 src를 dstsize - 1만큼 복사src의 길이를 리턴한다.dstsize가 0이면 리턴strlcatsize_t ft_strlcat(char *dst, const char *src, size_t dstsize);
dst에 src를 dstsize - 처음 dst의 길이 - 1만큼 붙여넣는다.처음 dst의 길이 + src의 길이를 리턴한다.dstsize가 0이거나 dst의 길이보다 같거나 작으면 dstsize + src의 길이를 리턴한다.strchrchar *ft_strchr(const char *s, int c);
s에서 첫 번째 c를 찾아서 그 위치를 반환한다.s에 c가 없는 경우 NULL을 반환한다.unsigned char로 해석한다.strrchrchar *ft_strrchr(const char *s, int c);
s에서 마지막 c를 찾아서 그 위치를 반환한다.s에 c가 없는 경우NULL을 반환한다.unsigned char로 해석한다.strnstrchar *strnstr(const char *big, const char *little, size_t len);
big의 len만큼 중에서 little을 찾아서 그 위치를 반환한다.little이 빈 문자열이면 big을 반환한다.little이 big에 없으면 NULL을 반환한다.strncmpint ft_strncmp(const char *s1, const char *s2, size_t n);
s1과 s2를 n만큼만 비교한다.atoiint ft_atoi(const char *str);
str을 int 형태로 변환하여 리턴한다.toupperint ft_toupper(int c);
tolowerint ft_tolower(int c);
isalphaint ft_isalpha(int c);
isupper와 islower를 모두 만족하는지 검사하는 함수
static 함수
- 정적 함수
- 해당 함수가 선언된 파일 내부에서만 사용할 수 있다.
- 참고
isdigitint ft_isdigit(int c);
isalnumint ft_isalnum(int c);
isasciiint ft_isascii(int c);
isprintint ft_isprint(int c);
부터 ~까지 (아스키코드 32부터 126까지)callocvoid *ft_calloc(size_t count, size_t size);
size 바이트를 count개만큼 할당하고 0으로 초기화하는 함수NULL 포인터를 반환한다.strdupchar *ft_strdup(const char *s1);
s1 크기만큼 메모리를 동적으로 할당하고 복사하는 함수substrchar *ft_substr(char const *s, unsigned int start, size_t len);
s를 start번째 인덱스부터 최대 len만큼 잘라서 새로운 문자열을 만들고 반환하는 함수len + 1만큼 동적 할당한다.NULL 포인터를 반환한다.start가 s의 인덱스 범위를 넘어서면 빈 문자열을 반환한다.strjoinchar *ft_strjoin(char const *s1, char const *s2);
s1과 s2를 연결한 새로운 문자열을 반환한다.strtrimchar *ft_strtrim(char const *s1, char const *set);
s1의 앞뒤에 있는 set을 삭제한 새로운 문자열을 반환한다.set은 문자의 모음으로, 각 문자가 기준이 된다.splitchar **ft_split(char const *s, char c);
s를 c로 구분한 포인터 배열을 반환한다.char *를 할당할지 먼저 구한다.char *를 strdup한다.free한다.free해야 한다.free 후에 포인터는 NULL로 초기화하는 것이 좋다. (허상 포인터(dangling pointer))NULL 포인터로 표시한다.itoachar *ft_itoa(int n);
n을 문자열로 변환하여 반환한다.get_size해서 동적 할당하고 부호별로 케이스를 나눠서 거꾸로 담는다.strmapichar *ft_strmapi(char const *s, char (*f)(unsigned int, char));
s의 각 문자에 f를 적용한 새로운 문자열을 반환한다.putchar_fdvoid ft_putchar_fd(char c, int fd);
fd)에 c를 쓰는 함수putstr_fdvoid ft_putstr_fd(char *s, int fd);
fd)에 s를 쓰는 함수putendl_fdvoid ft_putendl_fd(char *s, int fd);
fd)에 개행을 추가한 s를 쓰는 함수putnbr_fdvoid ft_putnbr_fd(int n, int fd);
fd)에 n를 쓰는 함수typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
lstnewt_list *ft_lstnew(void *content);
t_list를 만들어서 반환한다.content는 매개 변수로 받은 content로, next에는 NULL로 초기화한다.lstadd_frontvoid ft_lstadd_front(t_list **lst, t_list *new);
lst의 맨 앞에 new를 추가하는 함수lstsizeint ft_lstsize(t_list *lst);
lst로 시작하는 리스트의 길이를 반환한다.lstlastt_list *ft_lstlast(t_list *lst);
lst로 시작하는 리스트의 가장 마지막 t_list를 반환한다.lstadd_backvoid ft_lstadd_back(t_list **lst, t_list *new);
lst의 맨 뒤에 new를 추가하는 함수lstdelonevoid ft_lstdelone(t_list *lst, void (*del)(void *));
lst의 content을 del로 free한 다음 lst를 free하는 함수lstclearvoid ft_lstclear(t_list **lst, void (*del)(void *));
lst 하위 노드의 content를 del로 free한 다음 해당 노드도 free하고, 최종적으로 lst를 free하는 함수lst의 메모리가 해제되었다는 것을 알려주기 위해 *lst에 NULL을 할당한다.lstitervoid ft_lstiter(t_list *lst, void (*f)(void *));
lst로 시작하는 리스트의 각 노드의 content를 매개변수로 f를 호출하는 함수lstmapt_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *));
lst로 시작하는 리스트의 각 노드의 content에 f를 적용한 새로운 리스트를 생성하는 함수del로 노드를 삭제한다.result)next가 NULL일 때까지 반복하면서 새로운 노드 생성하고 lstadd_back으로 리스트 끝에 연결lstclear로 모든 메모리 해제