-
[42SEOUL] Libft: Part 242SEOUL 2021. 11. 9. 16:32
나만의 C 라이브러리 만들기 : C 표준 라이브러리에 있는 함수들을 직접 구현해보는 과제
[ itoa ]
- 정수를 문자열로 변환하는 함수
기능 및 선언 형태
- 받은 정수 n 의 부호 및 길이를 고려해 malloc 으로 메모리를 할당하고, 할당된 메모리에 부호와 정수 n , NULL (0) 값을 순차적으로 넣어준 후, 해당 메모리를 반환함.
char *itoa(int n);- int n : 문자열로 변환할 정수
반환 값
- 인자로 받은 정수를 문자열로 변환하여 반환함.
더 알아가기
- 이 함수는 비 표준함수로, C99/C11 규격에서 정의되지 않고 MS 컴파일러에서만 이용이 가능한 함수임. 즉, Linux/maxOS 등 비 마이크로소프트 운영체제(컴파일러)에서는 stdlib.h 헤더 파일을 include 한다고 해도 사용하지 못함. => itoa 함수 대신 sprintf 를 사용하는 것을 권장함.
- ltoa 함수는 존재하지만 ftoa 함수는 존재하지 않음.
[ putchar_fd ]
- 문자를 출력하는 함수
기능 및 선언 형태
- write 함수를 사용해, 인자로 받은 문자 c 를 주어진 fd 형태로 출력함.
void ft_putchar_fd(char c, int fd);- char c : 출력할 문자
- int fd : 출력에 사용할 파일 디스크립터
반환 값
- 없음.
[ putendl_fd ]
- 문자열과 개행 문자를 출력하는 함수
기능 및 선언 형태
- write 함수를 사용해, 인자로 받은 문자 s 를 주어진 fd 형태로 출력함.
- 이 때, 출력은 newline (개행 문자) 으로 끝남.
void ft_putendl_fd(char *s, int fd);- char *s : 출력할 문자열
- int fd : 출력에 사용할 파일 디스크립터
반환 값
- 없음.
[ putnbr_fd ]
- 정수를 문자열로 출력하는 함수
기능 및 선언 형태
- write 함수를 사용해, 인자로 받은 정수 n 를 주어진 fd 형태로 출력함.
void ft_putnbr_fd(int n, int fd);- int n : 문자열로 출력할 정수
- int fd : 출력에 사용할 파일 디스크립터
반환 값
- 없음.
더 알아가기
- 만약 들어오는 값이 정수의 최솟값인 "-2147483648"일 경우, 여기서 부호를 바꾸면 정수의 최댓값인 "2147483647"을 벗어나게 됨. 그렇기 때문에 이 부분은 미리 예외처리를 해주는 게 좋음.
[ putstr_fd ]
- 문자열을 출력하는 함수
기능 및 선언 형태
- write 함수를 사용해, 인자로 받은 문자열 s 를 주어진 fd 형태로 출력함.
void ft_putstr_fd(char *s, int fd);- char *s : 출력할 문자열
- int fd : 출력에 사용할 파일 디스크립터
반환 값
- 없음.
더 알아가기
- 문자열 s 가 비어있을 경우, 함수 자체가 작동이 안되도록 바로 리턴해주는 예외처리가 필요함.
[ split ]
- 특정 문자에 따라 주어진 문자열을 분할하는 함수
기능 및 선언 형태
- 구현 방법
- 문자 c 를 기준으로 나누어지는 문자열 s 의 개수를 구해서, 이중 포인터로 널 문자를 포함한 공간을 할당해줌.
- 각 공간에 해당하는 문자열을 담아주기 위해 위에서 구해준 개수만큼 반복하면서 메모리를 할당함. 이 때, 하위 문자열의 메모리를 할당하던 중 문제가 발생하면, 앞서 할당해준 모든 메모리를 free 해주며 0으로 초기화 해야 함.
- 이중 포인터의 마지막에는 반드시 0을 넣어주어야 함.
char **ft_split(char const *s, char c);- char const *s : 분할할 문자열의 시작 포인터(주소)
- char c : 구분 문자
반환 값
- 분할한 문자열을 담은 이중 포인터를 반환함.
더 알아가기
- s1 이 비어있을 경우, NULL을 반환함.
- string.h 에 strtok 라는 비슷한 함수도 존재함.
[ strjoin ]
- 입력받은 두 개의 문자열을 연결한 새로운 문자열을 반환하는 함수
기능 및 선언 형태
- 문자열 s1 과 문자열 s2 , 널 문자를 포함하는 길이를 구해 malloc으로 새 문자열의 공간을 할당하고, 순차적으로 복사하여 넣어줌.
char *ft_strjoin(char const *s1, char const *s2);- char const *s1 : 앞에 올 문자열의 시작 주소
- char const *s2 : 뒤에 올 문자열의 시작 주소
반환 값
- 성공 시, 새로운 문자열의 시작 주소를 반환함.
- 실패 시, NULL을 반환함.
더 알아가기
- 여기서의 예외처리는 두 가지 패턴으로 구현이 가능함.
- s1 이나 s2 가 NULL로 들어오는 경우를 예외로 처리하여 0을 반환
- 따로 예외처리를 하지 않고 segmentation fault 로 처리
[ strmapi ]
- 문자열에 특정 함수를 적용한 새로운 문자열을 반환하는 함수
기능 및 선언 형태
- 문자열 s 의 길이만큼 새 문자열을 할당하고, s[i] 에 f 함수를 적용한 값과 널 문자를 담아줌.
char *ft_strmapi(char const *s, char (*f)(unsigned int, char));- char const *s : 반복할 문자열
- char (*f)(unsigned int, char) : 각 문자에 적용할 함수
반환 값
- f 함수를 연속적으로 적용시킨 새 문자열을 반환함.
- 할당 실패 시, NULL을 반환함.
더 알아가기
- 여기서의 예외처리는 두 가지 패턴으로 구현이 가능함.
- s 이나 s2 가 NULL로 들어오는 경우를 예외로 처리하여 0을 반환
- 따로 예외처리를 하지 않고 segmentation fault 로 처리
[ strtrim ]
- 주어진 문자열의 처음과 끝에서 특정 문자들이 제거된 새로운 문자열을 반환하는 함수
기능 및 선언 형태
- 문자열 s1 의 처음과 끝에서 set 문자열에 포함되어 있는 문자가 연속적으로 존재할 경우, 문자를 제거해준 새 문자열을 만들어 반환해줌.
char *ft_strtrim(char const *s1, char const *set); /* 사용 방법 */ ft_strtrim("abcdaddbabc", "abc"); // 결과 : "dadd" ft_strtrim("abcabababc", "abc"); // 결과 : "" ft_strtrim("dddfgggdd", "abc"); // 결과 : "dddfgggdd" ft_strtrim("", "abc"); // 결과 : NULL- char const *s1 : 제거될 문자열
- char const *set : 제거할 참조 문자의 집합
반환 값
- 성공 시, 문자가 제거된 새 문자열을 반환함.
- 할당 실패 시, NULL을 반환함.
더 알아가기
- 문자열 s1 이 비어있을 때, NULL을 반환함.
- 찾을 문자 set 이 비어있을 때, 문자열 s1 을 새로 할당해서 반환함.
- 문자열 s1 이 모두 set 에 포함된 문자일 경우, 빈 문자열 ("") 을 할당하여 반환해주어야 함.
[ substr ]
- 입력 받은 문자열의 일부를 새로운 문자열로 생성해 반환하는 함수
기능 및 선언 형태
- 문자열 s 의 start 인덱스부터 len 길이만큼의 값을 할당한 새 문자열을 반환함.
char *ft_substr(char const *s, unsigned int start, size_t len); /* 사용 방법 */ ft_substr("aaba", 2, 1); // 결과 : "b" ft_substr("aaa", -, 0); // 결과 : 0이 들어간 문자열 "" ft_substr("aaaa", 6, -); // 결과 : 0이 들어간 문자열 ""- char const *s : 하위 문자열을 생성할 문자열의 시작 포인터(주소)
- unsigned int start : 하위 문자열의 시작 인덱스
- size_t len : 하위 문자열의 최대 길이
반환 값
- 성공 시, 할당된 새 문자열을 반환함.
- 할당 실패 시, NULL을 반환함.
더 알아가기
- 문자열 s1 이 비어있을 때, NULL을 반환함.
- 길이 len 이 0이거나, 문자열 s 의 길이가 start 보다 작거나 같을 때 빈 문자열 ("") 을 반환함.
더보기[출처/인용]
- https://norux.me/24
'42SEOUL' 카테고리의 다른 글
[42SEOUL] Netwhat : 넷마스크와 서브넷 마스크, 서브넷팅 (Netmask, Subnet mask, Subnetting) (0) 2021.11.09 [42SEOUL] Netwhat : 공인 IP와 사설 IP (Public/Private IP Address) (0) 2021.11.09 [42SEOUL] Netwhat : IP Address 란? (0) 2021.11.09 [42SEOUL] Libft: Bonus (0) 2021.11.09 [42SEOUL] Libft : Part 1 (0) 2021.11.09