복습

42SEOUL - libft - Part01 본문

42seoul/libft

42SEOUL - libft - Part01

ykm1256 2021. 5. 9. 21:02

1. memset

void	*ft_memset(void *ptr, int val, size_t size)

ptr을 size 크기만큼 val로 초기화 하는 함수

이 때 초기화 할 값인 c는 인자로는 int로 전달되지만 함수 내부적으로는 unsigned char로 형변환 되어서 사용된다.

그 이유는 unsigned char 는 모든 bit를 투명하게 볼 수있다. 즉, 다른 type 은 내부 비트의 일부를 값을 표현하기 위한 용도가 아닌 다른 용도(부호 비트)로 사용할 수 있으나 unsigned char 는 이것이 허락되지 않는다.

따라서, 임의의 메모리에 바이트 단위로 접근해 값을 다룰 때에는 반드시 unsigned char 를 사용해야 full portability 를 얻을 수 있다. 또한, 그와 같은 이유로 signed char 가 표현할 수 있는 값의 개수보다 unsigned char 가 표현할 수 있는 값의 개수가 많다는 사실에도 유의할 필요가 있다. signed char <-> unsigned char 사이의 값 변환이 1:1 로 이루어질 수 "없는" 경우도 있음을 의미한다.

이런 이유로, 표준이 바이트 값에 접근해야 하는 경우나 문자에 접근해야 하는 경우 (예: mem(), str() 함수들) 에는 모두 unsigned char 로 접근하도록 요구하고 있다.

출처 : https://kldp.org/node/75686

※ 이 함수는 바이트 단위로 초기화 하기 때문에 int형 배열을 초기화 할 때 주의 해야 한다.

예를 들어 memset(arr, 1, sizeof(arr))을 호출하면 1로 초기화 되는 것이 아니라 실제로는 16843009로 초기화 된다.

그 이유는 int는 4바이트이기 때문에 0001 00000001 00000001 00000001로 초기화 되기 때문이다.

즉, 바이트가 딱 알맞게 떨어지지 않기 때문에 1과 같은 정수를 그 값으로 초기화 할 수 없다.

0, -1, 0x3f, 0x7f는 가능.

출처 : https://blog.naver.com/chogahui05/221484049429

 

 

2. bzero

void	ft_bzero(void *ptr, size_t size)

memset과 비슷하며 ptr을 size 크기만큼 0으로 초기화 하는 함수

 

3. memcpy

void	*ft_memcpy(void *dst, const void *src, size_t size)

dst에 src를 size 크기만큼 복사하는 함수

주의 할 점은 mem, str 관련 함수들을 처리할 때 위에서 정리한 내용에 따라 unsigned char형을 써야 한다는 것이다.

또한, 테스터에서 모두 dst, src 모두 null인 경우에는 따로 처리를 해서 null값을 리턴해야 했고, 둘 중 하나만 null인 경우에는 따로 처리를 하지 않고 segmentation fault 오류를 뜨게 하는 것이 정답이었다.

 

4.memmove

void	*ft_memmove(void *dst, const void *src, size_t len)

memcpy와 유사하게 dst에 src를 복사하는 함수

dst와 src가 overlap된 경우를 생각해주어야 한다.

dst < src 일 때는 memcpy와 동일하게 복사해줘도 문제가 없지만, 

src < dst 일 경우에는 memcpy로 복사하게 되면 src메모리의 뒤쪽 부분과 dst 메모리의 앞쪽 부분이 겹치게 되어 src 메모리 뒤쪽부분의 값이 바뀌게 되므로 src메모리의 뒤쪽부터 복사해야 한다.

 

5. memchr

void	*ft_memchr(const void *str, int c, size_t size)

str 주소에 접근하여 size만큼 탐색하여 c값을 찾는데, c를 찾으면 그 주소값을 반환하고 못찾으면 null을 반환한다.

 

6. memcmp

int	ft_memcmp(const void *s1, const void *s2, size_t size)

s1과 s2에 접근하여 size 크기만큼 각각 탐색하면서 값이 다르면 그 차이값을 반환하고, 같다면 0을 반환한다.

 

7. strlcpy

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

dest에 src를 size-1 만큼 복사하고 마지막에 null을 채워주며, 리턴값은 src의 길이이다.

 

8. strlcat

size_t	ft_strlcat(char *dst, const char *src, size_t size)

dst의 뒤에 src를 이어 붙이는 함수로 size-1만큼 이어 붙이며 size의 크기에 따라 리턴값이 다름.

size > dst일 때 (dst + src)의 길이를 리턴하고, 

size < dst 일 때 size + src의 길이를 리턴한다.

 

9. strchr

char	*ft_strchr(const char *str, int c)

str에서 첫번째 c의 주소값을 반환하는 함수

str문자열에 c가 있는지 탐색하여 있다면 그 주소를 반환하고 없다면 null을 반환하는데, 이때 c가 0이면 문자열의 끝에는 null이 있으므로 문자열의 끝 주소를 반환해야한다.

 

10. strrchr

char	*ft_strrchr(const char *str, int c)

str에서 마지막 c의 주소값을 반환하는 함수

문자열 끝에서부터 탐색하여 c를 찾으면 그 주소를 반환하고, 없다면 null을 반환한다. 이때 c가 0이면 strchr과 동일하게 문자열의 끝 주소를 반환한다.

 

11. strncmp

size_t	ft_strncmp(const char *s1, const char *s2, size_t n)

s1과 s2를 n크기만큼 비교하는 함수

비교해서 다르면 차이값을 반환하고, 같다면 0을 반환한다.

 

12. atoi

int		ft_atoi(const char *str)

문자열을 그에 맞는 숫자로 변환하는 함수

  • 공백(is_space)를 스킵하고, 부호문자 하나를 받은 후 숫자만 처리한다.
  • 숫자가 아닌 다른 문자가 나오게 되면 멈추고 그때까지 계산한 수를 반환.
  • 64비트 환경에서 long은 8바이트로 long long과 같음.
  • atoi함수는 반환 데이터타입은 int 이지만 long의 오버, 언더 플로우를 처리해주어야 함.
  • 따라서 최댓값을 넘으면 최댓값을 int형으로 형변환한 -1을 반환하고,
  • 최솟값을 넘어가면 최소값을 int형으로 형변환한 0을 반환한다.

13. calloc

void	*ft_calloc(size_t cnt, size_t size)

size크기를 cnt개 만큼 동적할당 하여 모두 0으로 초기화 하는 함수이다.

 

14. strdup

char	*ft_strdup(const char *s1)

s1과 같은 크기만큼 동적할당하여 값을 복사한 후 주소값을 반환하는 함수

'42seoul > libft' 카테고리의 다른 글

42SEOUL - libft - bonus  (0) 2021.05.14
42SEOUL - libft - Part02  (0) 2021.05.14