#include "libft.h"
void *ft_memset(void *b, int c, size_t len)
{
unsigned int i;
i = 0;
while (i < len)
{
*((char *)b + i) = (unsigned char)c;
i++;
}
return (b);
}
void * : void pointer은 자료형이 정해지지 않은 포인터. 범용 포인터.
역참조 불가능!! -> 컴파일 에러
강제 형변환을 통해 역참조 가능 : *((char *)str)
unsigned char 는 모든 bit 를 투명하게 볼 수 있는 특성을 제공.
즉, 다른 type 은 내부 비트의 일부를 값을 표현하기 위한 용도가 아닌
다른 용도로 사용할 수 있으나 unsigned char 는 이것이 허락되지 않는다.
따라서, 임의의 메모리에 바이트 단위로 접근해 값을 다룰 때에는 반드시
unsigned char 를 사용해야 full portability 를 얻을 수 있는 것이다.
또한, 그와 같은 이유로 signed char 가 표현할 수 있는 값의 개수보다
unsigned char 가 표현할 수 있는 값의 개수가 많다는 사실에도 유의할
필요가 있다.
void ft_bzero(void *s, size_t n)
{
unsigned int i;
i = 0;
while (i < n)
{
*((char *)s + i) = 0;
i++;
}
}
#include "libft.h"
void *ft_memcpy(void *s1, const void *s2, size_t n)
{
unsigned int i;
unsigned char *dst;
unsigned const char *str;
if (s1 == 0 && s2 == 0)
return (0);
i = 0;
dst = (unsigned char *)s1;
str = (unsigned char *)s2;
while (i < n)
{
*(dst + i) = *(str + i);
i++;
}
return (dst);
}
#include "libft.h"
void *ft_memccpy(void *dst, const void *src, int c, size_t n)
{
unsigned char *dst2;
unsigned char *src2;
dst2 = (unsigned char *)dst;
src2 = (unsigned char *)src;
while (n != 0)
{
*dst2 = *src2;
if (*src2 == (unsigned char)c)
return (dst2 + 1);
dst2++;
src2++;
n--;
}
return (0);
}
#include "libft.h"
void *ft_memmove(void *dst, const void *src, size_t len)
{
size_t i;
if (dst == 0 && src == 0)
return (0);
i = 0;
if (dst < src)
ft_memcpy(dst, src, len);
else
while (len--)
*(unsigned char *)(dst + len) = *(unsigned char *)(src + len);
return (dst);
}
메모리 영역 오버랩발생 가능성 있다!
1. 한 배열 안에서 복사를 수행할 때
2. 그러면서 src 시작 주소가 dest 시작 주소보다 앞에 있을 때
오버랩의 가능성이 생긴다.
해결 - 뒤에서부터 복사해주면 된다.
#include "libft.h"
void *ft_memchr(const void *s, int c, size_t n)
{
unsigned char *s2;
s2 = (unsigned char *)s;
while (n--)
{
if (*s2 == (unsigned char)c)
return ((void *)s2);
s2++;
}
return (0);
}
#include "libft.h"
int ft_memcmp(const void *s1, const void *s2, size_t n)
{
unsigned char *str1;
unsigned char *str2;
if (s1 == s2 || n == 0)
return (0);
str1 = (unsigned char *)s1;
str2 = (unsigned char *)s2;
while (n--)
{
if (*str1 != *str2)
return (*str1 - *str2);
if (n != 0)
{
str1++;
str2++;
}
}
return (0);
}
#include "libft.h"
size_t ft_strlen(const char *s)
{
size_t i;
i = 0;
while (s[i])
i++;
return (i);
}
#include "stdlib.h"
size_t ft_strlcpy(char *dest, const char *src, size_t dstsize)
{
size_t srclen;
size_t i;
srclen = 0;
while (src[srclen] != 0)
srclen++;
if (dstsize == 0)
return (srclen);
i = 0;
while (src[i] && i < (dstsize - 1))
{
dest[i] = src[i];
i++;
}
dest[i] = 0;
return (srclen);
}
#include "libft.h"
size_t ft_strlcat(char *dest, const char *src, size_t dstsize)
{
size_t i;
size_t destlen;
size_t srclen;
i = 0;
destlen = ft_strlen(dest);
srclen = ft_strlen(src);
if (dstsize <= destlen)
return (dstsize + srclen);
while (src[i] && destlen + i + 1 < dstsize)
{
dest[destlen + i] = src[i];
i++;
}
dest[destlen + i] = 0;
return (destlen + srclen);
}
**수정 전**
char *ft_strchr(const char *s, int c)
{
char find;
int i;
find = (unsigned char)c;
i = 0;
while (!s[i])
{
if (s[i] == find)
return ((char *)s + i);
i++;
}
if (s[i] == find)
return ((char *)s + i);
return (0);
}
**수정 후**
#include "libft.h"
char *ft_strchr(const char *s, int c)
{
int i;
i = 0;
while (s[i])
{
if (s[i] == (char)c)
return ((char *)&s[i]);
i++;
}
if (c == 0)
return ((char *)&s[i]);
return (0);
}
예외처리
if (c == 0)
return ((char *)&s[i]);
#include "libft.h"
char *ft_strrchr(const char *s, int c)
{
char find;
int i;
find = (unsigned int)c;
i = ft_strlen(s);
while (i > 0)
{
if (s[i] == find)
return ((char *)s + i);
i--;
}
if (s[i] == find)
return ((char *)s);
return (0);
}
#include "libft.h"
void *ft_calloc(size_t count, size_t size)
{
void *mem;
if (!(mem = malloc(count * size)))
return (0);
ft_bzero(mem, (count * size));
return (mem);
}
#include "libft.h"
char *ft_strdup(const char *s1)
{
int i;
int len;
char *str;
len = ft_strlen(s1);
str = (char *)malloc(sizeof(char) * (len + 1));
if (!str)
return (NULL);
i = 0;
while (s1[i])
{
str[i] = s1[i];
i++;
}
str[i] = 0;
return (str);
}