Author | Created | Updated |
mcha(Min-jae Cha) | 2022. 01. 13 | 2022. 01. 13 |
ย Intro
42 Seoul์ ๋๋ถ๋ถ์ ๊ณผ์ ๋ C ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ๋ค.
์ด ๋, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ printf๋ ๋ด์ฅ ํจ์๋ค์ ์ฌ์ฉ์ด ๊ธ์ง๋์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ณผ์ ์์ ์ฌ์ฉํ๊ฒ๋ ํ์ฉํด์ฃผ๋ ํค๋๋ง์ include ํ์ฌ ์ ์ฝ์ ์ด๊ณ ์ผ๋ถ์ ํจ์๋ง ์ฌ์ฉ ํ๊ฒ๋ ๋์ด ์๋ค.
๋ค์ ๋งํด ์ฐ๋ฆฌ๋ ๋งค์ฐ ์ ์ฉํ ํ์ค ํจ์๋ค์ ์ฌ์ฉ ํ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ, ์ด ํ๋ก์ ํธ๋ฅผ ํตํด ์ฌ๋ฌ ํ์ค ํจ์๋ค์ ์ง์ ๊ตฌํํด ๋ณธ๋ค. ์ด ๊ณผ์ ์ ์ด๋ฆ์ธ libft๋ ํฅํ ์ฐ๋ฆฌ๊ฐ ์งํํ๋ ๊ณผ์ ์ ์ธํด๋ฃจ๋ ์์ผ์ ์ฌ์ฉ ํ ์ ์๋ค.
Subtitle
Your very first own library
Version
15
Specification
Program name | libft.a |
Turn in files | .c, libft.h, Makefile |
Makefile | Yes |
External functs. | Detailed below |
Libft authorized | Non-applicable |
Description | Write your own library, containing an extract of important functions for your cursus. |
ย Makefile
Click
ย Header
Click
ย Mandatory
1. memset
โ Synopsis
void *memset(void *b, int c, size_t len);
C
๋ณต์ฌ
โ Description
๋ฌธ์์ด b์ unsigned char๋ก ์นํ ๋ c๋ฅผ len bytes๋งํผ ์์ฑ(writes, settings)
โ Return Value
b์ ์ฒซ ๋ฒ์งธ ์ธ์(its first argument)
โ Code
// ๋ฌธ์์ด
void *ft_memset(void *b, int c, size_t len)
{
// 'void *' type b๋ฅผ unsigned char๋ก ํ ๋ณํ ํ๊ธฐ ์ํด arr ์์ฑ
unsigned char *arr;
// 'int' type c๋ฅผ unsigned char๋ก ํ ๋ณํ ํ๊ธฐ ์ํด src ์์ฑ
unsigned char src;
// len๊ณผ ๋น๊ตํ๊ธฐ ์ํด 'size_t' ํํ i ์์ฑ
size_t i;
// b๋ฅผ 'unsigned char *'๋ก ํ ๋ณํ
arr = b;
// c๋ฅผ 'unsigned char'๋ก ํ ๋ณํ
src = c;
// len bytes๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด i๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ len๊ณผ ๋น๊ต
i = 0;
while (i < len)
{
// ํ ๋ณํ ๋ c๋ฅผ arr์ ๋ฐ์ธ๋ฉ
*arr = src;
// arr ์ฃผ์ ๊ฐ ์ฆ๊ฐ
arr++;
// ๋์์ i๋ ์ฆ๊ฐ
i++;
}
// ๊ณ ์ณ์ง b๋ฅผ ๋ฆฌํด
return (b);
}
C
๋ณต์ฌ
2. memcpy
โ Synopsis
void *memcpy(void *restrict dst, const void *restrict src, size_t n);
C
๋ณต์ฌ
โ Description
n๋ฐ์ดํธ๋งํผ src๋ฅผ dst๋ก ๋ณต์ฌํ๋ค. ๋ง์ฝ dst์ src๊ฐ overlap๋๋ฉด ํ๋์ ์ ์ ๋์ง ์๋๋ค.
โ Return Value
dst์ ์๋ณธ ๊ฐ
โ Code
#include "libft.h"
// ํจ์ ์ํ
void *ft_memcpy(void *dst, const void *src, size_t n)
{
// dst์ src์ ํ ๋ณํ. void -> unsigned char
unsigned char *new_dst;
unsigned char *new_src;
// byte ๊ธธ์ด์ธ n๊ณผ ๋น๊ตํ๊ธฐ ์ํ i
size_t i;
// dst์ src๊ฐ ์๋ฒฝํ๊ฒ ๋๊ฐ์ง ์๊ฑฐ๋ ์ฌ์ด์ฆ๊ฐ 0๋ณด๋ค ํฌ๋ฉด ์ํ
if (dst != src && n)
{
// i ์ด๊ธฐํ
i = 0;
// dst ๋ณต์ฌ
new_dst = (unsigned char *)dst;
// src ๋ณต์ฌ
new_src = (unsigned char *)src;
// i๊ฐ n (bytes)๋ณด๋ค ์์ ๋ ๊น์ง ๋ฐ๋ณต
while (i < n)
{
// new_src์ ๊ฐ์ new_dst๋ก ๋ณต์ฌ
*new_dst = *new_src;
// ์ฃผ์ ๊ฐ ์ฆ๊ฐ
new_dst++;
new_src++;
// index ์ฆ๊ฐ
i++;
}
}
// dst์ ์๋ณธ ๋ฆฌํด
return (dst);
}
C
๋ณต์ฌ
3. memmove
โ Synopsis
void *memmove(void *dst, const void *src, size_t len);
C
๋ณต์ฌ
โ Description
len bytes๋งํผ src์์ dst๋ก ์ด๋ํจ. ๋ ๋ฌธ์์ด์ด ์ค๋ฒ๋ฉ์ผ ๋ ๋ณต์ฌ๋ ํญ์ ๋น ํ๊ดด์ ์ธ ํ์์์ ์๋ฃ๋จ.
โ Return Value
dst์ ์๋ณธ ๊ฐ
โ Code
#include "libft.h"
void *ft_memmove(void *dst, const void *src, size_t len)
{
// dst ํ ๋ณํ ํ
unsigned char *new_dst;
// src ํ ๋ณํ ํ
unsigned char *new_src;
// dst์ src๊ฐ ๋๊ฐ์ง ์๊ณ len์ด 0๋ณด๋ค ํด ๋ ์ํ
if (dst != src && len)
{
// dst ์ฃผ์ ๊ฐ์ด src์ ์ฃผ์ ๊ฐ๋ณด๋ค ์์ ๋
// ๊ธฐ์กด memcpy์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์ฎ๊ธด๋ค
if (dst < src)
{
new_dst = (unsigned char *)dst;
new_src = (unsigned char *)src;
while (len--)
*new_dst++ = *new_src++;
}
// dst ์ฃผ์ ๊ฐ์ด src์ ์ฃผ์ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋
// ๋ค์์ ๋ถํฐ ํ๋์ฉ ์ฎ๊ธด๋ค.
else
{
new_dst = (unsigned char *)dst + (len - 1);
new_src = (unsigned char *)src + (len - 1);
while (len--)
*new_dst-- = *new_src--;
}
}
return (dst);
}
C
๋ณต์ฌ
4. strlcpy
โ Synopsis
size_t strlcpy(char *restrict dst, const char *restrict src, size_t dstsize);
C
๋ณต์ฌ
โ Description
dst์ size-1๋งํผ src๋ฅผ ๋ณต์ฌ
โ Return Value
src์ ๊ธธ์ด
โ Code
#include "libft.h"
size_t ft_strlcpy(char *dst, const char *src, size_t dstsize)
{
// dstsize์ ๋น๊ตํ ๊ฐ์ธ idx
size_t idx;
idx = 0;
// ๋ง์ฝ ๋ณต์ฌ์ ๋์์ธ src๊ฐ ์์ผ๋ฉด 0์ ๋ฆฌํด src์ ๊ธธ์ด๊ฐ 0์ด๊ธฐ ๋๋ฌธ
if (!src)
return (0);
// ๋ณต์ฌํ ๊ธธ์ด๊ฐ 0์ด ์๋๋ฉด ์ํ
if (dstsize != 0)
{
// idx๊ฐ dstsize - 1์ผ ๋๊น์ง, ์๋ณธ ๊ฐ์ด null์ด ์๋ ๋๊น์ง ์ํ
while (idx < dstsize - 1 && src[idx])
{
// ๋ณต์ฌ, idx ์ฆ๊ฐ
dst[idx] = src[idx];
idx++;
}
// ๋ณต์ฌ๊ฐ ๋ dst์ ๋ง์ง๋ง์ null๋ฌธ์๋ฅผ ์ง์ด๋ฃ์ด ๋ง๋ฌด๋ฆฌ
dst[idx] = '\0';
}
// src์ ๊ธธ์ด ๋ฆฌํด
return (ft_strlen(src));
}
C
๋ณต์ฌ
5. strlcat
โ Synopsis
size_t strlcat(char * restrict dst, const char * restrict src, size_t dstsize);
C
๋ณต์ฌ
โ Description
src๋ฅผ dst์ dstsize๋งํผ ์ฐ๊ฒฐํด์ฃผ๋ ํจ์์ด๋ค.
โ Return Value
return the total length of the string they tried to create. For strlcat() that means the initial length of dst plus the length of src.
โ Code
#include "libft.h"
size_t ft_strlcat(char *dst, const char *src, size_t dstsize)
{
// dst์ ์ข
์๋๋ index
size_t i;
// src์ ์ข
์๋๋ index
size_t j;
// dst์ src์ ๊ธธ์ด
size_t len_dst;
size_t len_src;
i = 0;
j = 0;
len_dst = ft_strlen(dst);
len_src = ft_strlen(src);
// ๋ง์ฝ dstsize๊ฐ dst์ ๊ธธ์ด๋ณด๋ค ์์ผ๋ฉด, src์ ๊ธธ์ด์ dst_size๋ฅผ ๋ํด ๋ฆฌํด
if (dstsize < len_dst)
return (len_src + dstsize);
// dst์ ๋์ ์ฐพ์ ๋ ๋๋ ์ฌํ
while (dst[i])
i++;
// src์ i๊ฐ dstsize - 1์ผ๋ ์ํ (๋ง์ง๋ง์ NULL์ด ๋ค์ด๊ฐ์ผ ํ๊ธฐ ์ํด์.)
while (src[j] && i < dstsize - 1)
{
dst[i] = src[j];
i++;
j++;
}
// ๋ง์ง๋ง์ NULL ๋ฌธ์ ๋ฃ๊ธฐ
dst[i] = '\0';
// return the total length of the string tried to create.
return (len_dst + len_src);
}
C
๋ณต์ฌ
6. strchr
โ Synopsis
char *strchr(const char *s, int c);
C
๋ณต์ฌ
โ Description
๋ฌธ์์ด s์์ c๊ฐ ์ฒ์์ผ๋ก ๋ฐ๊ฒฌ๋๋ ๊ณณ์ ์ฐพ๋ ํจ์
โ Return Value
๋ฌธ์๊ฐ ์์นํ ํฌ์ธํฐ(์ฃผ์). ๋๋ ๋ฌธ์๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด NULL์ ๋ฆฌํด
โ Code
#include "libft.h"
char *ft_strchr(const char *s, int c)
{
// ๋ฌธ์์ด์ ์ํํ๋ฉฐ c์ ์ผ์นํ๋์ง ์ฌ๋ถ ํ์
while (*s)
{
// ๋ฌธ์ s์ c๊ฐ ๊ฐ์ผ๋ฉด
if (*s == c)
// s์ ์ฃผ์ ๊ฐ์ ํ ๋ณํํ์ฌ ๋ฆฌํด
return ((char *)s);
// ์ฐพ์ ๋ ๊น์ง ์ฃผ์ ์ฆ๊ฐ
s++;
}
// ๋ง์ฝ s๊ฐ 0(NULL)์ด๊ณ , s์ c๊ฐ ๊ฐ๋ค๋ฉด. (s์ c ๋ชจ๋ NULL)
if (*s == 0 && *s == c)
// NULL์ด ์์นํ ์ฃผ์ ๋ฆฌํด
return ((char *)s);
// ๋ชป ์ฐพ์ผ๋ฉด NULL ๋ฆฌํด
return (0);
}
C
๋ณต์ฌ
7. strrchr
โ Synopsis
char *strrchr(const char *s, int c);
C
๋ณต์ฌ
โ Description
๋ฌธ์์ด s์์ c๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ฐ๊ฒฌ๋๋ ๊ณณ์ ์ฐพ๋ ํจ์
โ Return Value
๋ฌธ์๊ฐ ์์นํ ํฌ์ธํฐ(์ฃผ์). ๋๋ ๋ฌธ์๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด NULL์ ๋ฆฌํด
โ Code
#include "libft.h"
char *ft_strrchr(const char *s, int c)
{
// ๋ฌธ์์ด s์ ๊ธธ์ด๊ฐ ๋ idx
int idx;
// s์ ๊ธธ์ด ๋ฐ์ธ๋ฉ
idx = ft_strlen(s);
// idx๊ฐ 0์ด ๋ ๋ ๊น์ง. ๋ค์ ๋งํด s[0]๊น์ง ์ํ
while (idx >= 0)
{
// ๋ง์ฝ c๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ๋ฆฌํด
if (s[idx] == (char)c)
// ๋ฌธ์์ด์ ๋ค์์๋ถํฐ ์ํํ๊ธฐ ๋๋ฌธ์ s ์ฃผ์ ๊ฐ์ idx๋ฅผ ๋ํ ์ฃผ์ ๊ฐ์ ๋ฆฌํด
return ((char *)s + idx);
idx--;
}
return (NULL);
}
C
๋ณต์ฌ
Comment
return ((char *)s + idx);
* NULL์ ํฌํจํ idx
๋ง์ฝ ์ฃผ์ด์ง s๊ฐ "abcd"์ด๊ณ ์ฐพ๋ ๋ฌธ์๊ฐ 'c'๋ผ๊ณ ๊ฐ์ ํ์ ๋, idx๋ 2๊ฐ ๋๋ค.
๋ฐ๋ผ์ ํ์ฌ s๊ฐ 'a'๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก 2๋ฅผ ์ฆ๊ฐ์ํจ ์ฃผ์ ๊ฐ์ ๋ฆฌํดํ๋ค.
char *s = "tree";
int c = 'r' + 256;
8. strncmp
โ Synopsis
int strncmp(const char *s1, const char *s2, size_t n);
C
๋ณต์ฌ
โ Description
* lexicographically compare the null-terminated strings s1 and s2.
์ฌ์ ์์ผ๋ก null-terminated๊น์ง s1์ s2๋ฅผ ๋น๊ตํ๋ค.
์ฃผ์ด์ง n๊ฐ๊น์ง ๋ฌธ์๋ฅผ ๋น๊ตํ๊ณ NULL('\0') ๋ฌธ์ ๋ค์ ์จ ๋ฌธ์๋ค์ ๋น๊ตํ์ง ์๋๋ค.
โ Return Value
0๋ณด๋ค ํฐ, ๊ฐ์, ์์ ์ ์๋ฅผ ๋ฐํํ๋ค. unsigned characters ๋ฅผ ํ์ฉํด ๋น๊ตํ๊ธฐ ๋๋ฌธ์ '\200'์ '\0'๋ณด๋ค ํฌ๋ค.
9. memchr
โ Synopsis
void *memchr(const void *s, int c, size_t n)
C
๋ณต์ฌ
โ Description
unsigned char ๋ก ํ ๋ณํ ๋ s์์ ์ฒ์์ผ๋ก c๊ฐ ๋ฐ๊ฒฌ๋๋ ๊ณณ์ ์ฐพ๋ ํจ์
โ Return Value
์ฐพ์ ์์น์ ํฌ์ธํฐ ๋๋ n bytes ์ด๋ด์ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด NULL์ ๋ฆฌํด
10. memcmp
โ Synopsis
int memcmp(const void *s1, const void *s2, size_t n);
C
๋ณต์ฌ
โ Description
s1๋ฅผ ๊ธฐ์ค์ผ๋ก s2์ n๋งํผ ๋น๊ตํ๋ค
โ Return Value
๋ง์ฝ ๋ ๋ฌธ์์ด์ด ๋์ผํ๋ค๋ฉด(identical) 0์ ๋ฐํ.
๋ค๋ฅด๋ค๋ฉด ๋ ๋ฌธ์์ ์ฐจ์ด๋ฅผ ๋ฐํ ์ด ๋, ๋ ๋ฌธ์๋ unsigned char๋ก ๋ํด์ง๋ค.
๊ธธ์ด๊ฐ 0์ธ ๋ ๋ฌธ์์ด์ ํญ์ identical ํจ.
11. strnstr
โ Synopsis
char *strnstr(const char *haystack, const char *needle, size_t len);
C
๋ณต์ฌ
โ Description
needle์ด haystack์์ ์ฒ์์ผ๋ก ๋ํ๋ ๊ณณ์ ์ฃผ์ด์ง len ์ด๋ด์์ ์ฐพ๋๋ค.
NULL('\0')๋ฌธ์๊ฐ ๋ํ๋ ์ดํ์ ๋ฌธ์๋ ๊ฒ์ ๋์ง ์๋๋ค.
โ Return Value
๋ง์ฝ needle์ด ๋น ๋ฌธ์์ด์ด๋ผ๋ฉด haystack์ด ๋ฐํ ๋๋ค.
๋ง์ฝ needle์ด haystack์ ์ด๋ ๊ณณ์์๋ ๋ํ๋์ง ์๋๋ค๋ฉด NULL์ ๋ฆฌํดํ๋ค.
๋ง์ฝ needle์ด haystack์ ์๋ค๋ฉด, needle์ด ์ฒ์์ผ๋ก ๋ํ๋ ๊ณณ์ ์ฃผ์๋ฅผ ๋ฐํํ๋ค.
โ Code
#include "libft.h"
char *ft_strnstr(const char *haystack, const char *needle, size_t len)
{
// len๊ณผ ๋น๊ต ๋ needle์ ๊ธธ์ด t_len
size_t t_len;
// ๋ง์ฝ needle์ด ๋น ๋ฌธ์์ด์ด๋ผ๋ฉด haystack์ ์ฃผ์ ๊ฐ์ ๋ฐํ
if (*needle == '\0')
return ((char *)haystack);
// ์ฐพ๋ ๋ฌธ์์ด(needle)์ ๊ธธ์ด๋ฅผ t_len์ ๋ฐ์ธ๋ฉ
t_len = ft_strlen(needle);
// haystack์ด null์ด ์๋๊ณ len์ด t_len๋ณด๋ค ๊ฐ๊ฑฐ๋ ํด ๋ ๊น์ง ๋ฐ๋ณต
while (*haystack && (len-- >= t_len))
{
// ๋ง์ฝ haystack์ '๋ฌธ์'์ needle์ '๋ฌธ์'์ ๊ฐ๋ค๋ฉด
if (*haystack == *needle)
{
// ๊ทธ ๊ณณ ๋ถํฐ needle์ ๊ธธ์ด๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น๊ตํ๋ค.
// ๋ง์ฝ ๊ฒฐ๊ณผ๊ฐ 0์ด๋ฉด needle์ด ์จ์ ํ haystack ์์ ๋ค์ด์๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์
// haystack์ ์ฃผ์๋ฅผ ๋ฐํํ๋ค.
if (ft_memcmp(haystack, needle, t_len) == 0)
return ((char *)haystack);
}
haystack++;
}
// ๋ชป ์ฐพ์ผ๋ฉด NULL ๋ฆฌํด
return (0);
}
C
๋ณต์ฌ
Comment
len โฅ t_len
haystack์ "abcdef" , needle์ "cd", len์ด 3์ผ ๋ haystack์ a, b, c๊น์ง ์ํํ๋ค.
๋ง์ฝ c๊น์ง ์ํ ํ์ ๋ *haystack๊ณผ *needle์ด ๊ฐ์ง๋ง needle์ด ๋ชจ๋ ๋ฐ๊ฒฌ ๋๋ ์์ ์ len์ ๋ฒ์ด๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฆฝ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ๋จ์ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ needle์ ๊ธธ์ด๋ณด๋ค ๊ฐ๊ฑฐ๋ ์ปค์ผ ํ๋ค.
12. atoi
โ Synopsis
int atoi(const char *str);
C
๋ณต์ฌ
โ Description
initial portion์ ๋ฌธ์๋ฅผ int๋ก ๋ณํํ๋ค.
โ Return Value
๋ณํ ๋ ๊ฐ
โ Code
#include "libft.h"
// ๊ณต๋ฐฑ ํ๋ณ
static int ft_isspace(char c)
{
if ((c >= '\t' && c <= '\r') || c == ' ')
return (1);
return (0);
}
// ๋ถํธ ํ๋ณ
static int ft_issign(char c)
{
if (c == '+' || c == '-')
return (1);
return (0);
}
// ์ ํ๋ณ
static int ft_isnum(char c)
{
if (c >= '0' && c <= '9')
return (1);
return (0);
}
int ft_atoi(const char *str)
{
// ๋ถํธ
int sign;
// ๋ถํธ ์
int cnt_sign;
// ๊ฒฐ๊ณผ
long long result;
// sign : 1 or -1
sign = 1;
// ๋ถํธ ์
cnt_sign = 0;
result = 0;
// ๊ณต๋ฐฑ ๋ถ๋ถ ์คํต
while (ft_isspace(*str))
str++;
// ๋ถํธ ๋ถ๋ถ ์คํต
while (ft_issign(*str))
{
// ๋ง์ฝ str ๋ฌธ์๊ฐ '-'๋ผ๋ฉด sign์ -1 ๊ณฑํด์ค
if (*str == '-')
sign *= -1;
// ์ฃผ์ ๊ฐ ์ฆ๊ฐ
str++;
// ๋ถํธ ์ ์ฆ๊ฐ
cnt_sign++;
// ๋ง์ฝ ๋ถํธ ์๊ฐ 1๋ณด๋ค ํฌ๋ค๋ฉด 0 ๋ฆฌํด
if (cnt_sign > 1)
return (0);
}
// ์ซ์๋ฅผ ํ๋ณํ์ฌ ์ซ์๋ฉด ๊ณ์ ์งํ
while (ft_isnum(*str))
{
// result์ ์๋ ๊ฐ์ 10์ ๊ณฑํ๊ณ str๋ฌธ์๋ฅผ ์๋ก ๋ฐ๊พธ์ด ๋ํด์ค
result = (result * 10) + (*str - '0');
str++;
}
// result์ ๋ถํธ๋ฅผ ๊ณฑํด์ ๋ฐํ
return ((int)result * sign);
}
C
๋ณต์ฌ
13. calloc
โ Synopsis
void *calloc(size_t count, size_t size);
C
๋ณต์ฌ
โ Description
size bytes์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ณ ์๋ count๋งํผ์ ์ฐ์์ ์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
โ Return Value
ํ ๋น ๋ memory์ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ์ด ํ ๋น ๋ ๋ฉ๋ชจ๋ฆฌ๋ 0์ผ๋ก ์ฑ์์ ธ ์๋ค.
๋ง์ฝ ์๋ฌ ๋ฐ์ ์ NULL ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
โ Code
#include "libft.h"
void *ft_calloc(size_t count, size_t size)
{
// voidํ์ ๋น ํฌ์ธํฐ ๊ฐ์ฒด ์์ฑ
void *buf;
// malloc์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น
buf = (void *)malloc(count * size);
// ๋ง์ฝ ์ ๋๋ก ํ ๋น์ด ๋์ง ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด NULL์ ๋ฐํํ๋ค
if (!buf)
return (NULL);
// ํ ๋น์ด ์ฑ๊ณตํ๋ค๋ฉด, ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 0์ผ๋ก ์ฑ์ฐ๊ณ ๋ฐํํ๋ค.
ft_bzero(buf, count * size);
return (buf);
}
C
๋ณต์ฌ
14. strdup
โ Synopsis
char *strdup(const char *s1);
C
๋ณต์ฌ
โ Description
s1์ ๋ณต์ฌํ๊ธฐ ์ํ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋ค์ ๋ณต์ฌ ํ, ์ด ๊ฒ์ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
โ Return Value
s1์ด ๋ณต์ฌ ๋ ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ๋ฐํ
๋ง์ฝ malloc์ด ์ ๋๋ก ์ํ๋์ง ์์๋ค๋ฉด NULL ๋ฐํ
โ Code
#include "libft.h"
char *ft_strdup(const char *s1)
{
// char type์ ๊ฐ์ฒด ์์ฑ
char *buf;
int idx;
idx = 0;
// malloc์ผ๋ก s1์ ๊ธธ์ด + null์ ๊ธธ์ด ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น
buf = (char *)malloc((ft_strlen(s1) + 1) * sizeof(char));
// ํ ๋น ์ค๋ฅ ์ NULL ๋ฐํ
if (!buf)
return (NULL);
// s1์ด NULL์ผ ๋ ๊น์ง ๋ฐ๋ณตํ๋ฉฐ buf[idx]์ s1[idx]๋ฅผ ํ ๋น
while (s1[idx])
{
buf[idx] = s1[idx];
idx++;
}
// ๋ง์ง๋ง ๊ณต๊ฐ์ NULL ๋ฌธ์๋ฅผ ๋ฃ์ ํ buf์ ์ฃผ์๋ฅผ ๋ฐํ
buf[idx] = '\0';
return (buf);
}
C
๋ณต์ฌ
15. substr
โ Synopsis
char *ft_substr(char const *s, unsigned int start, size_t len);
C
๋ณต์ฌ
โ Description
๋ฌธ์์ด 's'์ ๋ถ๋ถ ๋ฌธ์์ด์ ํ ๋นํ๊ณ ๋ฐํํฉ๋๋ค.
๋ถ๋ถ ๋ฌธ์์ด์ ์์์ 'start'๋ถํฐ 'len'๊น์ง ์
๋๋ค.
โ Return Value
๋ถ๋ถ ๋ฌธ์์ด
๋ง์ฝ ํ ๋น์ด ์คํจํ๋ฉด NULL์ ๋ฐํํ๋ค.
16. strjoin
โ Synopsis
char *ft_strjoin(char const *s1, char const *s2);
C
๋ณต์ฌ
โ Description
๋ฌธ์์ด 's1'๊ณผ 's2'๋ฅผ ํฉ์น ๊ฒฐ๊ณผ์ธ ํ ๋น ๋ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
โ Return Value
์๋ก์ด ๋ฌธ์์ด
ํ ๋น์ด ์คํจํ๋ฉด NULL ๋ฐํ
โ Code
#include "libft.h"
char *ft_strjoin(char const *s1, char const *s2)
{
// s1๊ณผ s2๋ฅผ ํฉ์น๋ ์๋ก์ด ๋ฌธ์์ด
char *buf;
// s1๊ณผ s2์ ๊ธธ์ด
size_t len_s1;
size_t len_s2;
// ๋ง์ฝ ๋ ๋ฌธ์์ด ์ค ํ๋๋ผ๋ ๋น ๋ฌธ์์ด์ด๋ฉด NULL ๋ฐํ
if (!s1 || !s2)
return (NULL);
// s1๊ณผ s2์ ๊ธธ์ด ๋ฐ์ธ๋ฉ
len_s1 = ft_strlen(s1);
len_s2 = ft_strlen(s2);
// s1๊ณผ s2์ ๊ธธ์ด ๊ทธ๋ฆฌ๊ณ NULL๋ฌธ์์ ๊ธธ์ด๋ฅผ ํฌํจํ์ฌ buf์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
buf = (char *)malloc((len_s1 + len_s2 + 1) * sizeof(char));
// ๋ง์ฝ buf ํ ๋น์ด ์คํจํ๋ฉด NULL ๋ฆฌํด
if (!buf)
return (NULL);
// strlcpy๋ฅผ ํ์ฉํด s1์ ํ ๋น
ft_strlcpy(buf, s1, len_s1 + 1);
// strlcpy๋ฅผ ํ์ฉํด s2์ ํ ๋น
ft_strlcpy(buf + len_s1, s2, len_s2 + 1);
return (buf);
}
C
๋ณต์ฌ
17. split
โ Synopsis
char **ft_split(char const *s, char c);
C
๋ณต์ฌ
โ Description
'c'๋ฅผ ๊ตฌ๋ถ ๋ฌธ์๋ก ์ฌ์ฉํ์ฌ s๋ฅผ ๋๋ ๋ฐฐ์ด์ ๋ง๋๋ ๊ฒ. ์ด ๋ฐฐ์ด์ ๋ฐ๋์ NULL ํฌ์ธํฐ๋ก ๋๋์ผ ํ๋ค.
โ Return Value
split๋ ๊ฒฐ๊ณผ์ธ ์๋ก์ด ๋ฌธ์์ด ๋ฐฐ์ด์ ๋ฐํ
๋ง์ฝ ํ ๋น์ด ์คํจํ๋ค๋ฉด NULL ๋ฐํ
โ Code
#include "libft.h"
// ๋จ์ด์ ๊ฐ์๋ฅผ ๋ฐํํ๋ ํจ์
static int ft_count(char const *s, char c)
{
int cnt;
cnt = 0;
while (*s)
{
if (*s == c)
cnt++;
s++;
}
return (cnt + 1);
}
// ํ ๋น ๋ ๋ฐฐ์ด์ free ํด์ฃผ๋ ํจ์์ด๋ค
static char **ft_free_garb(char **a)
{
int i;
i = 0;
while (a[i])
{
free(a[i]);
i++;
}
free(a);
return (NULL);
}
// ๋ฌธ์์ด s๋ฅผ c๋ก ๋๋๊ธฐ
char **ft_split(char const *s, char c)
{
// ๋๋์ด์ง ๋จ์ด๋ฅผ ๋ด์ tmp
char *tmp;
// ๋ง์ง๋ง์ ๋ฆฌํด์ด ๋ ๋ชจ๋ ๋จ์ด๋ฅผ ๋ด์ tab
char **tab;
int i;
i = 0;
// ft_count -> c๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จ์ด์ ๊ฐ์๋ฅผ ๋ฐํ
// ๋จ์ด์ ๊ฐ์ + 1(NULL)๋งํผ tab์ ํ ๋น
tab = (char **)malloc((ft_count(s, c) + 1) * sizeof(char *));
// ๋ง์ฝ ํ ๋น์ด ์คํจํ๊ฑฐ๋ s๊ฐ NULL์ด๋ผ๋ฉด NULL ๋ฐํ
if (!tab || !s)
return (NULL);
// s๋ฅผ ์ํํ๋ฉด์ ์ํ
while (*s)
{
// ๋ง์ฝ s์ ๋ฌธ์์ c๊ฐ ๋ค๋ฅด๋ค๋ฉด ๋จ์ด์ ์ํ๋๊ฒ์ผ๋ก
if (*s != c)
{
// tmp์ ํ์ฌ s์ ์ฃผ์๋ฅผ ์ ์ฅํ๊ณ
tmp = (char *)s;
// s๊ฐ c๊ฐ ์๋ ๋๊น์ง ์ฃผ์๋ฅผ ์ฆ๊ฐ์ํจ๋ค
while (*s && *s != c)
s++;
// ft_substr์ ์ฌ์ฉํ์ฌ tmp์ ์ฒซ ๋ฒ์งธ ์ฃผ์๋ถํฐ ์ฐพ์๋ธ ๊ธธ์ด๊น์ง tab[i]์ ํ ๋น
tab[i] = ft_substr(tmp, 0, (s - tmp));
// ๋ง์ฝ ์ ๋๋ก ํ ๋น์ด ๋์ง ์์๋ค๋ฉด free
if (!tab[i])
return (ft_free_garb(tab));
i++;
}
// s์ c๊ฐ ๊ฐ๋ค๋ฉด ์ฃผ์ ์ฆ๊ฐ
else
s++;
}
// ๋ง์ง๋ง์ NULL
tab[i] = NULL;
return (tab);
}
C
๋ณต์ฌ
18. itoa
โ Synopsis
char *ft_itoa(int n);
C
๋ณต์ฌ
โ Description
argument๋ก ๋ฐ์์จ ์ ์๋ฅผ string์ผ๋ก ์ฌ ํด์ํ์ฌ ํ ๋นํ๊ณ ๋ฐํ
์์๋ ๋ฐ๋์ ๋ค๋ฃจ์ด์ ธ์ผํ๋ค.
โ Return Value
์ ์๊ฐ ์ฌ ํด์ ๋ ๋ฌธ์์ด์ ๋ฐํ
๋ง์ฝ ํ ๋น์ด ์คํจํ๋ค๋ฉด NULL ๋ฌธ์ ๋ฐํ
19. strtrim
โ Synopsis
char *ft_strtrim(char const *s1, char const *set);
C
๋ณต์ฌ
โ Description
s1์ ์์๊ณผ ๋์์ set์ ๋ช
์ ๋ ๋ฌธ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
โ Return Value
trimmed ๋ ๋ฌธ์์ด
ํ ๋น ์คํจ ์ NULL ๋ฐํ
20. strmapi
โ Synopsis
char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
C
๋ณต์ฌ
โ Description
๋ฌธ์์ด 's'์ ๊ฐ๊ฐ์ ๋ฌธ์๋ฅผ ํจ์ 'f'์ ์ ์ฉ์ํค๊ธฐ.
๊ฐ๊ฐ์ ๋ฌธ์์ ์ธ๋ฑ์ค๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ ์๋ก์ด ๋ฌธ์์ด์ ์์ฑํ๊ธฐ
โ Return Value
ํจ์ 'f'๊ฐ ์ ์ฉ ๊ทธ๋ฆฌ๊ณ ์์ฑ ๋ ๋ฌธ์์ด
ํ ๋น ์คํจ ์ NULL ๋ฐํ