libft

hhkim·2021년 5월 5일
0

42cursus

목록 보기
1/20
post-thumbnail

Makefile

https://modoocode.com/311
https://devanix.tistory.com/195 (ar 명령)

  • 만들어진 라이브러리(libft.a) 포함하여 컴파일하기
gcc -Wall -Werror -Wextra -o test *.c -L. -lft
  • Makefile에서도 조건문을 사용할 수 있다.
  • bonus 규칙의 relink를 방지하기 위해 WITH_BONUS라는 변수를 플래그로 사용한다.
  • Phony 타겟
  • 묵시적 규칙: 오브젝트 파일을 생성하는 명령어를 따로 작성하지 않아도 자동으로 컴파일해주는 기능
    • 타겟이 오브젝트 파일을 의존하는 경우 자동으로 묵시적 규칙을 찾아 해당 c파일의 o파일을 생성해준다.

+

  • 메모리 구조
    • 동적 할당 시 메모리의 힙 영역을 사용한다.
  • static 함수
    • 같은 소스 코드 안에서만 사용할 수 있는 함수
    • 다른 소스 코드에 같은 이름을 가진 다른 기능의 함수가 있어도 문제 없이 작동한다. (함수 이름 중복 문제 해결)
    • 해당 소스 코드 내에서만 사용하는 함수이므로 외부에 노출할 필요가 없기 때문에 static을 사용한다.
  • 메모리 관련 함수에서 데이터를 unsigned char로 변환하는 이유
    • 메모리를 1바이트 단위로 접근할 때, 모든 비트를 온전히 보존할 수 있는 자료형이기 때문

Part 1

memset

https://devdocs.io/c/string/byte/memset

void	*ft_memset(void *b, int c, size_t len);
  • bclen 바이트 만큼 쓰는 함수
  • 이때 cunsigned 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);
  • dstsrcn 바이트만큼 복사하는 함수
  • dstsrc 모두 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);
  • dstsrcn 바이트만큼 복사
  • src에서 c까지 복사하고 그 다음 dst의 주소를 반환한다.
  • c를 만나지 않고 n 바이트가 모두 복사되었다면 NULL 포인터를 반환한다.
  • cunsigned char로 변환된다.

memmove

https://devdocs.io/c/string/byte/memmove

void	*ft_memmove(void *dst, const void *src, size_t len);
  • dstsrclen만큼 복사
  • dstsrc 모두 unsigned char로 해석된다.
  • dst를 반환한다.
  • srcdst보다 작은 경우 overlap 현상이 발생할 수 있으므로, 뒤부터 복사한다.

memcpymemmove의 차이

👉 현재는 memcpy의 overlap 문제도 해결된 상태지만 과거에는 아래와 같은 차이가 존재

  • memcpy는 데이터를 바로 복사하고, memmove는 임시 공간에 저장했다가 복사한다.
  • memcpy가 더 빠르고, memmove가 더 안전하다.
  • dstsrc가 같은 주소를 참조할 때, memcpy의 경우 겹침(overlap) 현상이 일어나서 예상치 못한 결과를 얻을 수 있다.
  • 참고

memchr

void	*ft_memchr(const void *s, int c, size_t n);
  • sn만큼에서 c가 나타나는 첫 번째 주소를 반환한다.
  • c가 없으면 NULL 포인터를 반환한다.
  • cunsigned char로 변환된다.

memcmp

int	ft_memcmp(const void *s1, const void *s2, size_t n);
  • s1s2n만큼 비교한다.
  • 둘이 같으면 0, 그렇지 않으면 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);
  • dstsrcdstsize - 1만큼 복사
  • 마지막에 널 문자를 보장한다.
  • src의 길이를 리턴한다.
  • dstsize가 0이면 리턴

strlcat

size_t	ft_strlcat(char *dst, const char *src, size_t dstsize);
  • dstsrcdstsize - 처음 dst의 길이 - 1만큼 붙여넣는다.
  • 마지막에 널 문자를 보장한다.
  • 복사하고자 의도한 문자열의 길이(처음 dst의 길이 + src의 길이를 리턴한다.
  • dstsize가 0이거나 dst의 길이보다 같거나 작으면 dstsize + src의 길이를 리턴한다.

strchr

char	*ft_strchr(const char *s, int c);
  • s에서 첫 번째 c를 찾아서 그 위치를 반환한다.
  • sc가 없는 경우 NULL을 반환한다.
  • 각 문자를 unsigned char로 해석한다.

strrchr

char	*ft_strrchr(const char *s, int c);
  • s에서 마지막 c를 찾아서 그 위치를 반환한다.
  • sc가 없는 경우NULL을 반환한다.
  • 각 문자를 unsigned char로 해석한다.

strnstr

char	*strnstr(const char *big, const char *little, size_t len);
  • biglen만큼 중에서 little을 찾아서 그 위치를 반환한다.
  • little이 빈 문자열이면 big을 반환한다.
  • littlebig에 없으면 NULL을 반환한다.

strncmp

int	ft_strncmp(const char *s1, const char *s2, size_t n);
  • s1s2n만큼만 비교한다.
  • 아스키 코드의 차이를 반환한다.

atoi

  • stdlib.h
int	ft_atoi(const char *str);
  • strint 형태로 변환하여 리턴한다.
  • 앞의 공백을 제거하고, 그 이후에 부호는 하나만 유효한 것으로 간주한다.
  • 숫자가 아닌 값 전까지만 변환한다.
  • 변환할 수 없는 경우 0을 리턴한다.
  • 오버플로우, 언더플로우 처리 관련 참고

toupper

  • ctype.h
int	ft_toupper(int c);
  • 소문자를 대문자로 바꾸는 함수
  • 소문자면 대문자로 바꾼 아스키 코드 리턴, 그렇지 않으면 받은 인자를 그대로 리턴

tolower

  • ctype.h
int	ft_tolower(int c);
  • 대문자를 소문자로 바꾸는 함수

isalpha

  • ctype.h
int	ft_isalpha(int c);
  • isupperislower를 모두 만족하는지 검사하는 함수
  • 검사 결과가 거짓이면 0, 그렇지 않으면 1을 리턴한다.

    static 함수

    • 정적 함수
    • 해당 함수가 선언된 파일 내부에서만 사용할 수 있다.
    • 참고

isdigit

  • ctype.h
int	ft_isdigit(int c);
  • 숫자 문자인지를 검사하는 함수
  • 결과가 거짓이면 0, 그렇지 않으면 1을 리턴한다.

isalnum

  • ctype.h
int	ft_isalnum(int c);
  • 숫자거나 알파벳인지 검사하는 함수
  • 결과가 거짓이면 0, 그렇지 않으면 1을 리턴한다.

isascii

  • ctype.h
int	ft_isascii(int c);
  • 아스키 코드인지 검사하는 함수
  • 0부터 127까지 범위
  • 결과가 거짓이면 0, 그렇지 않으면 1을 리턴한다.

isprint

  • ctype.h
int	ft_isprint(int c);
  • 출력 가능한 문자인지 검사하는 함수
  • 부터 ~까지 (아스키코드 32부터 126까지)
  • 결과가 거짓이면 0, 그렇지 않으면 1을 리턴한다.

calloc

void	*ft_calloc(size_t count, size_t size);
  • size 바이트를 count개만큼 할당하고 0으로 초기화하는 함수
  • 할당된 메모리의 첫 번째 주소를 반환한다.
  • 오류가 발생하면 NULL 포인터를 반환한다.

strdup

char	*ft_strdup(const char *s1);
  • s1 크기만큼 메모리를 동적으로 할당하고 복사하는 함수
  • 할당된 공간의 첫 번째 주소를 반환한다.

Part 2

substr

char	*ft_substr(char const *s, unsigned int start, size_t len);
  • sstart번째 인덱스부터 최대 len만큼 잘라서 새로운 문자열을 만들고 반환하는 함수
  • len + 1만큼 동적 할당한다.
  • 동적 할당이 실패하면 NULL 포인터를 반환한다.
  • 끝에 널 문자 삽입
  • starts의 인덱스 범위를 넘어서면 빈 문자열을 반환한다.

strjoin

char	*ft_strjoin(char const *s1, char const *s2);
  • s1s2를 연결한 새로운 문자열을 반환한다.

strtrim

char	*ft_strtrim(char const *s1, char const *set);
  • s1의 앞뒤에 있는 set을 삭제한 새로운 문자열을 반환한다.
  • set은 문자의 모음으로, 각 문자가 기준이 된다.
  • 앞에서부터 검사 & 뒤에서부터 검사해서 시작과 끝 인덱스를 알아낸 다음 새로운 문자열을 생성한다.

split

char	**ft_split(char const *s, char c);
  • sc로 구분한 포인터 배열을 반환한다.
  • 몇 개의 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를 쓰는 함수
  • 재귀 함수

Bonus Part

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 *));
  • lstcontentdelfree한 다음 lstfree하는 함수

lstclear

void	ft_lstclear(t_list **lst, void (*del)(void *));
  • lst 하위 노드의 contentdelfree한 다음 해당 노드도 free하고, 최종적으로 lstfree하는 함수
  • 명시적으로 lst의 메모리가 해제되었다는 것을 알려주기 위해 *lstNULL을 할당한다.

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로 시작하는 리스트의 각 노드의 contentf를 적용한 새로운 리스트를 생성하는 함수
  • 필요한 경우 del로 노드를 삭제한다.
  • 새로운 첫 번째 노드 생성 (result)
  • nextNULL일 때까지 반복하면서 새로운 노드 생성하고 lstadd_back으로 리스트 끝에 연결
  • 중간에 실패하면 lstclear로 모든 메모리 해제

0개의 댓글