---
description: >-
  42SEOUL에서는 필요하다고 생각되는 함수라면 직접 구현해 사용해야 한다. 이 프로젝트를 통해 C 표준 함수들을 재구현하면서 함수의 작동
  원리와 사용법, 그리고 C언어에서 데이터와 그에 필요한 메모리를 어떻게 효율적으로 관리하고 다룰 수 있는지 배울 수 있었다.
---

# \[Libft] 나만의 C 라이브러리 만들기

## 1. 프로젝트 소개

42SEOUL에서는 이미 정의되어 있는 표준 함수들을 사용해 프로젝트를 진행하는 것이 금지되어 있다. 필요하다고 생각되는 함수라면 직접 구현해 사용해야 한다. 이 프로젝트를 통해 유용한 C 표준 함수들을 재구현하면서 함수의 작동 원리와 사용법, 그리고 C언어에서 데이터와 그에 필요한 메모리를 어떻게 효율적으로 관리하고 다룰 수 있는지 배울 수 있었다. 이 라이브러리의 함수 리스트는 42SEOUL에서 학습하는 기간 동안, 필요할 때 마다 꾸준히 업데이트 할 계획이다.

## 2. 몇 가지 규칙들

* 프로젝트는 Norm 규칙에 맞춰 작성되어야 합니다. 보너스 파일/함수가 있는 경우, 해당 파일/함수들은 norm 검사에 포함되며, norm error가 있을 시, 0점을 받게 될것 입니다.
* 함수들은 정의되지 않은 행동들과는 별개로 예기치 않게 중단되어서는 안 됩니다. (예를 들어, segmentation fault, bus error, double free 등)
* 필요한 경우 heap에 할당된 모든 메모리 공간은 적절하게 해제되어야 합니다. 메모리 누수는 용납되지 않을 것입니다.
* 그 과제가 필요하다면, Makefile을 제출해야 합니다. 그것은 `-Wall -Wextra -Werror` 플래그를 지정하여 컴파일할 것입니다. 그리고 Makefile은 `relink` 되어서는 안됩니다.
* Makefile은 최소한 `$(NAME)`, `all`, `clean`, `fclean`, `re`를 포함해야 합니다.
* 프로젝트에 보너스를 제출하려면, Makefile에 보너스 규칙을 포함해야 합니다. 이보 너스 규칙은 프로젝트의 메인 부분에서 금지되었던 모든 다양한 헤더, 라이브러리, 또는 함수들은 추가해야 할 것입니다. 보너스는 반드시 `_bonus.{c/h}`라는 다른 파일 에 있어야 합니다. 의무적으로 해야 될 파트과 보너스 파트는 별도로 평가될 것입니 다.
* 프로젝트에서 당신의 libft를 허용한다면, 소스들과 그것과 연관된 Makefile을 연관 된 Makefile과 함께 libft폴더에 복사해야 합니다. 프로젝트의 Makefile은 Makefile 을 사용하여 라이브러리를 컴파일한 다음, 프로젝트를 컴파일해야 합니다.
* 이 과제물을 제출하지 않고 등급이 매겨지지 않을지라도, 우리는 당신의 프로젝트를 위한 테스트 프로그램을 만들 것을 권장합니다. 그것은 너의 work와 peer’s work를 쉽게 테스트할 기회를 제공할 것입니다. 너는 defence하는 동안 이 테스트 프로그램 들이 특히 유용하다는 것을 알게 될 것입니다. 사실, defence하는 동안, 너는 너의 테 스트 프로그램과 평가 받는 동료의 테스트 프로그램들을 자유롭게 사용할 수 있을것 입니다.
* 할당된 git 저장소에 과제물을 제출하세요. 오직 git 저장소에 있는 과제물만 등급이 매겨질 것입니다. 만약 너의 과제를 평가받는데 Deepthought가 배정된다면, 그것은 동료평가 이후에 이루어질 것입니다. 만약 Deepthought 평가 중에 오류가 발생한다면, 그 즉시 평가는 중지될 것입니다.

## 3. Mandatory part

이 라이브러리의 함수들은 크게 세 가지 파트로 나눌 수 있다.

* 첫 번째는 C 표준 라이브러리인 `Libc`의 함수들.
* 두 번째는 문자열을 다루는 유용한 함수들.
* 세 번째는 리스트를 다루는 유용한 함수들.

### Part 1 : Libc functions

첫 번째 파트에서는, man에 정의되어 있는 대로 libc functions의 set을 재구현했다. 함수들은 원본과 같은 형식의 프로토타입을 선언한다. 함수의 이름 앞에는 `ft_`를 붙였다.

예를 들어 `strlen`은 -> `ft_strlen`.

재구현해야 하는 함수의 프로토타입의 일부는 `restrict` 한정자를 사용하지만, 이 키워드는 c99 표준의 일부분이기 때문에 `restrict` 한정자를 프로토타입에 포함시키고 `-std=c99` 플래그를 사용하여 컴파일 하는 것은 금지된다.

아래의 함수들을 구현했다. 이 함수들은 외부 함수들을 필요로 하지 않는다.

> memset • bzero • memcpy • memccpy • memmove • memchr • memcmp • strlen • strlcpy • strlcat • strchr • strrchr • strnstr • strncmp • atoi • isalpha • isdigit • isalnum • isascii • isprint • toupper • tolower

그리고 아래의 함수들은 `malloc`함수를 사용하여 재구현 했다.

> calloc • strdup

### Part 2 : Additional functions

두 번째 파트에서는, libc에 포함되있지 않거나 다른 형식으로 포함된 functions의 set을 재구현했다. 이 함수 중 일부는 구현 시 part1의 함수를 사용했다.

> substr • strjoin • strtrim • split • itoa • strmapi • putchar\_fd • putstr\_fd • putendl\_fd • putnbr\_fd

함수에 대한 자세한 설명은 아래 Part2 페이지에서.

## 4. Bonus part

메모리와 문자열을 다루는 함수를 사용하는 것도 편리하지만, 실제 프로젝트를 진행할 때는 리스트를 다루는 함수가 훨씬 필요했다.

리스트의 요소들은 다음의 구조를 갖는다. 이 구조를 libft.h 파일에 추가했다.

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

아래의 함수들을 구현해 라이브러리에 추가했다.

> ft\_lstnew • ft\_lstadd\_front • ft\_lstsize • ft\_lstlast • ft\_lstadd\_back • ft\_lstdelone • ft\_lstclear • ft\_lstiter • ft\_lstmap

함수에 대한 자세한 설명은 아래 Bonus 페이지에서.
