Search
๐Ÿชต

Libft

Created
2022/01/13 12:27
Updated
2022/01/13 13:25
Tags
Circle 00
Library
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 ๋ฐ˜ํ™˜