[libft] 함수들 간단 정리 (Part 1)

hyeojung·2021년 5월 14일
0

42Seoul

목록 보기
4/16
post-thumbnail

42서울 첫 과제, 나만의 C 라이브러리 만들기를 하면서 구현한 함수들을 여기에 간단하게 정리해 보려고 한다!
첫 과제인 만큼 생각보다 어렵지 않아서 조금만 더 공부를 열심히 했더라면 더 금방 끝낼 수 있지 않았을까 하는 아쉬움이 있다 😥




ft_memset

void	*ft_memset(void *dest, int c, size_t size);

dest 포인터가 가리키는 메모리를 c라는 값으로 size만큼 set해주는 함수
바이트 단위로 초기화하므로 c를 unsigned char 형으로 캐스팅해 주어야 한다!
unsigned char 형을 바이트마다 대입해 주어야 하므로 dest 포인터는 (char*) 형으로 캐스팅해 주어야 한다.


ft_bzero

void	*ft_bzero(void *dest, size_t size);

memset과 비슷한 역할을 하는 함수로, dest 포인터가 가리키는 메모리를 널(\0) 값으로 size만큼 초기화해준다.


ft_memcpy

void	*ft_memcpy(void *dest, const void *src, size_t size);

메모리 영역을 복사해주는 함수이다.
src가 가리키는 메모리 영역을 dest가 가리키는 메모리 영역에 size만큼 바이트 단위로 복사((char*) 타입으로 캐스팅 필요)한다.


ft_memccpy

void	*ft_memccpy(void *dest, const void *src, int c, size_t size);

src가 가리키는 메모리 영역을 dest가 가리키는 메모리 영역에 size만큼 복사하되, c라는 문자가 나올 때까지만 복사한다(c 포함).
dest가 가리키는 메모리 영역에서 c가 복사된 인덱스의 다음 인덱스 주소를 반환한다.


ft_memmove

void	*ft_memmove(void *dest, const void *src, size_t size);

memcpy 함수와 비슷하게 dest에 src를 size만큼 복사하지만, 메모리 영역이 겹칠 경우를 고려한다.
메모리 영역이 겹치지 않으면 memcpy와 같은 방식으로 동작하며 메모리 영역이 겹치는 경우는 뒤에서부터 복사한다. 오버랩되더라도 정상적인 복사가 이루어지도록 하기 위해서이다.


ft_memchr

void	*ft_memchr(const void *s, int c, size_t size);

s를 size만큼 바이트 단위로 검사하여 c라는 문자가 있다면 c가 존재하는 인덱스의 주소를 반환한다.
바이트 단위로 검사해야 하므로 s는 (char*) 형으로, c는 unsigned char 형으로 캐스팅해야 한다.


ft_memcmp

int	ft_memcmp(const void *dest, const void *src, size_t size);

dest와 src를 바이트 단위로 size만큼 비교하여, 비교 도중 같지 않으면 dest[i] - src[i] 값을 반환한다.
바이트 단위로 비교하므로 (char*) 형으로의 타입 캐스팅이 필요하다.


ft_strlen

size_t	ft_strlen(const char *str)

널 문자를 제외한 문자열의 길이를 반환하는 함수이다.


ft_strlcpy

size_t	ft_strlcpy(char *dest, const char *src, size_t size);

dest 문자열에 src 문자열을 size-1만큼 복사하고, 마지막에 널 문자를 넣어 준다.
널 문자를 보장해 준다는 점에서 strcpy보다 안정적이다.
반환값은 src 문자열의 길이이다.


ft_strlcat

size_t	ft_strlcat(char *dest, const char *src, size_t size);

dest 문자열에 src 문자열을 이어붙이되, size - strlen(dest) - 1만큼 이어붙이고 맨 뒤에 널 문자를 넣어 준다.
반환값은 결합되는 문자열의 총 길이이다.
size는 대상 버퍼의 크기로 strlen(dest)에 의존적이다. 따라서 반환값은 size와 strlen(dest)에 따라 달라지게 된다.

size < strlen(dest) 인 경우 : size + strlen(src) 가 리턴된다.
size >= strlen(dest) 인 경우 : strlen(src) + strlen(dest) 가 리턴된다.

예를 들어 dest = "hello", src = "world!!" 인 경우, size에 따른 반환값은 다음과 같다.

strlen(dest)strlen(src)size반환값이어붙인 후 dest 문자열
5707hello
57512hello
57712hellow
571012helloworl
5710012helloworld!!

ft_strchr

char	*ft_strchr(const char *s, int c);

s 문자열에서 c라는 문자를 검색한다.
s 내에 c가 있다면 c문자가 존재하는 인덱스의 주소를 반환하고, 없다면 널 포인터를 반환한다.


ft_strrchr

char	*ft_strrchr(const char *s, int c);

s 문자열에서 c라는 문자를 검색하되, 맨 끝에 있는 c를 검색한다.
찾았다면 c문자가 존재하는 인덱스의 주소를 반환하고, 없다면 널 포인터를 반환한다.


ft_strnstr

char	*ft_strnstr(const char *str, const char *find, size_t size);

str에서 size 길이만큼 find 문자열을 검색한다.
str이 find를 포함한다면 str에서 find가 시작되는 부분의 주소를 반환한다. 포함하지 않는다면 널 포인터를 반환한다.


ft_strncmp

int	ft_strncmp(const char *s1, const char *s2, size_t size);

s1 문자열과 s2 문자열을 size만큼 비교하여, 비교 도중 같지 않으면 s1[i] - s2[i] 값을 반환한다. 같다면 널 값을 반환한다.


ft_atoi

int	ft_atoi(const char *str);

문자열을 정수로 변환해주는 함수이다.
문자열의 앞부분에는 여러 개의 공백이 올 수 있으며, 그 다음에는 '+'나 '-'가 한 개 올 수 있고, 그 다음에 숫자가 올 수 있다.
숫자 외의 다른 문자가 있을 경우 그 문자가 등장하기 전까지의 문자열만을 정수로 변환하여 반환한다.

정말 많이 삽질했던 😅 오버플로우/언더플로우 처리 !

실제 atoi 함수는 libc에 의해 strtol 함수를 내부에서 호출하여 결과값을 리턴하는데, strtol 함수의 반환값은 atoi와 달리 long 형이다.
따라서 atoi에서 나오는 오버플로우/언더플로우 값은 strtol 함수의 결과값을 처리하는 과정에서 생기는 erange 오류이다.
-> strtol 함수의 오버플로우/언더플로우 반환값 : LONG_MAX/LONG_MIN
--> atoi 함수의 long 오버플로우/언더플로우 반환값 : -1/0

+) 하지만 libft-unit-test 외의 다른 테스터와 뮬리넷은 이런 오버플로우/언더플로우까지는 평가하지 않는다고 한다... 결론은 나 삽질했어요 ! 🤨🤨


ft_isalpha

int	ft_isalpha(int c);

c에 해당하는 아스키코드 값이 알파벳이면 1을, 아니면 0을 반환하는 함수


ft_isdigit

int	ft_isdigit(int c);

c에 해당하는 아스키코드 값이 숫자이면 1을, 아니면 0을 반환하는 함수


ft_isalnum

int	ft_isalnum(int c);

c에 해당하는 아스키코드 값이 알파벳이나 숫자이면 1을, 아니면 0을 반환하는 함수


ft_isascii

int	ft_isascii(int c);

c 값이 아스키코드 범위 내에 있다면 1을, 아니면 0을 반환하는 함수


ft_isprint

int	ft_isprint(int c);

c에 해당하는 아스키코드 값이 출력 가능하면 1을, 아니면 0을 반환하는 함수


ft_toupper

int	ft_toupper(int c);

c에 해당하는 아스키코드 값이 알파벳 소문자라면 대문자로 변환하여 반환하는 함수


ft_tolower

int	ft_tolower(int c);

c에 해당하는 아스키코드 값이 알파벳 대문자라면 소문자로 변환하여 반환하는 함수


ft_calloc

void	*ft_calloc(size_t count, size_t size);

size 크기의 자료형을 count 만큼 넣을 수 있는 메모리 공간을 할당하고,
할당한 메모리의 모든 바이트를 널로 초기화하여 반환한다.


ft_strdup

char	*ft_strdup(const char *str);

strlen(str)+1만큼의 메모리 공간을 할당하고, 그 공간에 문자열 str을 복사한 후 복사된 문자열을 가리키는 포인터를 반환한다.



profile
응애 나 애기 개발자

0개의 댓글