Libft part1 (2/1)
1. memset
함수이름
- ft_memset
프로토타입
- void *ft_memset(void *dest, int value, size_t num)
매개변수
-void *dest : 채우고자 하는 메모리의 시작 주소
-int value : 메모리에 담을 값 ( int 형이지만 함수 내부적으로 unsigned char(1byte)로 변환되어서 저장됨
-size_t num : 채우고자하는 바이트 담을 개수
리턴값
- void *dest
설명
- num바이트 메모리 크기만큼 value값을 메모리 dest에 채움
주로 메모리 초기화를 목적으로 사용된다.
void *ft_memset(void *dest, int value, size_t num)
{
size_t i;
i = 0;
while (i < num)
{
*((unsigned char *)dest + i) = (unsigned char)value;
i++;
}
return (dest);
}
2. bzero
함수이름
- ft_bzero
프로토타입
- void *ft_bzero(void *str, size_t num)
매개변수
-void *str : 채우고자 하는 메모리의 시작 주소
- size_t num : 채우고자하는 바이트 개수
리턴값
- void
설명
- str의 위치부터 num개의 바이트만큼 0으로 초기화 해주는 함수이다.
void ft_bzero(void *str, size_t num)
{
unsigned char *dest;
size_t i;
dest = str;
i = 0;
while (i++ < num)
*dest++ = 0;
}
3. memcpy
함수이름
- ft_memcpy
프로토타입
- void *ft_memcpy(void *dest, const void *src, size_t cnt)
매개변수
-void *dest : 복사가 되는 메모리 시작 주소
-const void *src : 복사할 메모리 시작주소 값
-size_t cnt : 메모리 담을 바이트 개수
리턴값
- void *dest
설명
- src의 위체에서 cnt개의 바이트 만큼 dest에 복사한다.
이 함수는 null 종료문자를 검사하지 않고 size_t cnt 만큼만 복사한다.
그리고 dest와 src의 주소 값이 겹치지 않도록 주의해야한다. (두 주소가 겹칠경우 memmove 함수를 사용하자)
#include "libft.h"
void *ft_memcpy(void *dest, const void *src, size_t cnt)
{
char *temp;
const char *s;
size_t i;
if (!dest && !src)
return (NULL);
temp = dest;
s = src;
i = 0;
while (i < cnt)
{
temp[i] = s[i];
i++;
}
return (temp);
}
4. memccpy
함수이름
- ft_memccpy
프로토타입
- void *ft_memccpy(void *dest, const void *src, int c, size_t n)
매개변수
-void *dest : 복사가 되는 메모리 시작 주소
-const void *src : 복사할 메모리 시작주소
-int c : src데이터에서 c를 만나면 복사를 중단할 값(내부적으로 unsigned char 형변환)
-size_n : 복사할 바이트 개수
리턴값
- void *dest or NULL
설명
- c문자를 찾을때 까지 src문자열을 dest에 복사한다. 도중에 문자 c를 찾으면 dest의 c와 일치하는 다음 주소값을 반환하고
src의 값에서 n만큼 복사하는 도중 문자 c를 찾지 못하면 NULL값을 반환한다.
#include "libft.h"
void *ft_memccpy(void *dest, const void *src, int c, size_t n)
{
size_t i;
unsigned char *t_dest;
const unsigned char *t_src;
i = 0;
t_dest = dest;
t_src = src;
if (!dest && !n)
return (NULL);
while (i < n)
{
t_dest[i] = t_src[i];
if (t_src[i] == (unsigned char)c)
return (&dest[i + 1]);
++i;
}
return (NULL);
}
5. memmove
함수이름
- ft_memmove
프로토타입
- void *ft_memmove(void *dest, const void *src, size_t num)
매개변수
-void *dest : 채우려는 메모리 시작 주소
-const void *src : 복사할 메모리의 시작주소 ( int 형이지만 함수 내부적으로 unsigned char(1byte)로 변환되어서 저장됨
-size_t num : 메모리 담을 바이트 개수
리턴값
- void *dest
설명
- 문자열 src를 num개의 바이트만큼 dest로 복사하는 함수
memcpy와 기능은 비슷하지만 memmove함수에서는 src와 dest의 메모리 영역이 겹치지 않는다. (겹치지 않는 메모리부터 먼저 복사하기때문)
#include "libft.h"
void *ft_memmove(void *dest, const void *src, size_t num)
{
unsigned char *temp;
const unsigned char *s;
size_t i;
if (dest == src || num == 0)
return (dest);
temp = dest;
s = src;
i = 0;
if (dest < src)
while (i < num)
{
temp[i] = s[i];
i++;
}
else
while (i < num)
{
temp[num - i - 1] = s[num - i - 1];
i++;
}
return (temp);
}
6. memchr
함수이름
- ft_memchr
프로토타입
- void *ft_memchr(const void *ptr, int ch, size_t cnt)
매개변수
-const void *ptr, : 검색할 메모리 시작주소
-int ch : 찾을 문자 ( int 형이지만 함수 내부적으로 unsigned char(1byte)로 변환되어서 저장됨
-size_t cnt : 검색을 수행할 바이트 수
리턴값
- 문자를 찾은 위치 리턴, 값을 찾지 못하면 NULL
설명
- 메모리블록에서 문자를 찾는다.
#include "libft.h"
void *ft_memchr(const void *ptr, int ch, size_t cnt)
{
size_t i;
unsigned char c;
unsigned char *s;
i = 0;
c = (unsigned char)ch;
s = (unsigned char*)ptr;
while (i < cnt)
{
if (s[i] == c)
return (s + i);
i++;
}
return (NULL);
}
7. memcmp
함수이름
- ft_memcmp
프로토타입
- int ft_memcmp(const void *ptr1, const void *ptr2, size_t num)
매개변수
-const void *ptr1 :비교할 첫 번째 메모리 시작주소
-const void *ptr2 : 비교할 두 번째 메모리 시작주소
-size_t num : 비교할 바이트 개수
리턴값
- ptr1 > ptr2 : 양수
- ptr1 == ptr2 : 0
- ptr1 < ptr2 :음수
설명
- ptr1 과 ptr2 를 num 바이트만큼 비교한다.
#include "libft.h"
int ft_memcmp(const void *ptr1, const void *ptr2, size_t num)
{
unsigned char *p1;
unsigned char *p2;
size_t i;
p1 = (unsigned char *)ptr1;
p2 = (unsigned char *)ptr2;
i = 0;
while (num--)
{
if (p1[i] != p2[i])
return (p1[i] - p2[i]);
i++;
}
return (0);
}
8. strlen
함수이름
- ft_strlen
프로토타입
- size_t ft_strlen(const char *s)
매개변수
-const char *s : 길이를 계산할 문자열
리턴값
- 문자열 길이
설명
- 문자열 s의 길이를 반환
#include "libft.h"
size_t ft_strlen(const char *s)
{
size_t len;
len = 0;
while (s[len] != '\0')
{
len++;
}
return (len);
}
9. strlcpy
함수이름
- ft_strlcpy
프로토타입
- size_t ft_strlcpy(char *dest, const char *src, size_t size)
매개변수
-char *dest : 복사될 메모리 시작 주소
-const char *src : 복사할 메모리 시작주소
-size_t size : 복사할 바이트 개수
리턴값
- size_t i : src의 총 길이
설명
- src에서 dest로 size만큼 길이를 복사한다
문자열 마지막에 NULL값으로 채워준다.
#include "libft.h"
size_t ft_strlcpy(char *dest, const char *src, size_t size)
{
size_t i;
i = 0;
if (size > 0)
{
while (src[i] && i + 1 < size)
{
dest[i] = src[i];
++i;
}
dest[i] = 0;
}
while (src[i])
++i;
return (i);
}
10. strlcat
함수이름
- ft_strlcat
프로토타입
- size_t ft_strlcat(char *dest, char *src, size_t size)
매개변수
-char *dest : 복사될 메모리 시작 주소
-char *src : 붙이려는 메모리 시작주소
-size_t size : 복사할 바이트 개수
리턴값
- size < strlen(dest) -> strlen(src) + size
- size > strlen(dest) -> strlen(src) + strlen(dest)
설명
- 문자열 src를 dest 끝에 추가해주는 함수이다.
#include "libft.h"
size_t ft_strlcat(char *dest, char *src, size_t size)
{
size_t dest_len;
size_t i;
size_t src_len;
dest_len = ft_strlen(dest);
src_len = ft_strlen(src);
i = 0;
if (size <= dest_len)
return (src_len + size);
while (*dest)
dest++;
while ((i + dest_len + 1 < size) && src[i])
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return (dest_len + src_len);
}
11. strchr
함수이름
- ft_strchr
프로토타입
- char *ft_strchr(const char *s, int c)
매개변수
-const char *s : 대상 문자열
-int c : 검색할 문자
리턴값
- 해당 문자로 시작하는 문자열의 주소를 반환
설명
- 문자열 s 에서 문자 c를 검색하는 함수이다.
#include "libft.h"
char *ft_strchr(const char *s, int c)
{
while (*s != (char)c)
{
if (*s == '\0')
return (NULL);
s++;
}
return ((char *)s);
}
12. strrhr
함수이름
- ft_strrchr
프로토타입
- char *ft_strrchr(const char *s, int c)
매개변수
-const char *s : 대상 문자열
-int c : 검색할 문자
리턴값
- 문자열 s에 검색할 문자 c가 존재한다면 c의 주소값을 문자 c가 없다면 NULL을 반환
설명
- 문자열 s 에서 맨 뒤에 있는 문자c를 검색하는 함수이다. (문자열 s의 마지막인덱스부터 검색)
#include "libft.h"
char *ft_strrchr(const char *s, int c)
{
size_t len;
len = ft_strlen(s);
while (len != 0)
{
if (s[len] == (char)c)
return ((char *)&s[len]);
len--;
}
if (s[len] == (char)c)
return ((char *)s + len);
return (NULL);
}