[42Seoul] Libft part2

jiyseo·2022년 4월 15일
0

42 Seoul

목록 보기
3/9

ft_substr

SUBSTR 함수는 문자단위로 시작위치와 자를 길이를 지정하여 문자열을 자른다.

  • 함수 : SUBSTR("문자열", "시작위치", "길이")
#include"libft.h"

char	*ft_substr(char const	*s, unsigned int	start, size_t	len)
{
	size_t	i;
	size_t	j;
	char	*res;

	i = 0;
	j = 0;
	if (!s)
		return (NULL);
	res = (char *)malloc(sizeof(char) * (len + 1));
	if (!res)
		return (NULL);
	while (s[i])
	{
		if (i >= start && j < len)
		{
			res[j] = s[i];
			j++;
		}
		i++;
	}
	res[j] = '\0';
	return (res);
}

ft_strjoin

char ft_strjoin(char const s1, char const *s2);

malloc(3) 을 이용하여 메모리를 할당받은 후, 문자열 's1' 과 's2' 를 이어붙인 새로운 문자열을 생성하여 반환합니다.

#include"libft.h"

char	*ft_strjoin(char const	*s1, char const	*s2)
{
	size_t	len_s1;
	size_t	len_s2;
	char	*res;

	if (!s1 || !s2)
		return (NULL);
	len_s1 = ft_strlen(s1);
	len_s2 = ft_strlen(s2);
	res = (char *)malloc(sizeof(char) * (len_s1 + len_s2 + 1));
	if (!res)
		return (NULL);
	ft_memcpy(res, s1, len_s1);
	ft_memcpy(res + len_s1, s2, len_s2);
	res[len_s1 + len_s2] = 0;
	return (res);
}

ft_strtrim

char ft_strtrim(char const s1, char const *set)

반환 값

s1에서 찾은 set에 포함된 문자들을 양 끝에서 제거한 후 결과 문자열, 할당 실패 시 NULL 반환.

설명

malloc(3)를 사용하여 할당하고 문자열의 처음과 끝에서 'set'에 지정된 문자가 제거된 's1' 복사본을 반환

#include"libft.h"

char	*ft_strtrim(char const	*s1, char const	*set)
{
	size_t	start;
	size_t	end;
	char	*res;

	if (!s1)
		return (NULL);
	if (!set)
		return (ft_strdup(s1));
	start = 0;
	end = ft_strlen(s1);
	while (s1[start] && ft_strchr(set, s1[start]))
		start++;
	while (s1[end - 1] && ft_strchr(set, s1[end - 1]))
	{
		if (end - 1 < 1)
			break ;
		end--;
	}
	if (start > end)
		return (ft_strdup(""));
	res = (char *)malloc(sizeof(char) * (end - start + 1));
	if (!res)
		return (NULL);
	ft_strlcpy(res, s1 + start, end - start + 1);
	return (res);
}

ft_split

char *ft_split(char str, char *charset)

str 문자열을 charset의 구분자를 기준으로 분할하여 return 하는 함수

분할한 새 문자열 배열, 할당 실패 시 NULL 반환

split함수는 2차원메모리를 할당하는 함수이므로 반드시 메모리 해제를 잊지않고 해야됩니다.

sizeof(char ) (ft_word_cnt(str, c) + 1) 괄호 안함 이거 Abort error

while 문에 continue를 안함

→ str의 값과 c가 같은 경우 str의 주소값을 두 번 증가시킴

ft_split 함수와 ft_word_cnt 둘 다 continue 추가

#include"libft.h"

char	**ft_free(char	**res)
{
	unsigned int	i;

	i = 0;
	while (res[i])
	{
		free(res[i]);
		i++;
	}
	free(res);
	return (NULL);
}

unsigned int	ft_word_cnt(char const *str, char c)
{
	unsigned int	cnt;

	cnt = 0;
	while (*str)
	{
		if (*str++ == c)
			continue ;
		++cnt;
		while (*str && *str != c)
			++str;
	}
	return (cnt);
}

void	ft_strcpy(char *dst, char *from, char const *until)
{
	while (from < until)
		*(dst++) = *(from++);
	*dst = '\0';
}

char	**ft_split_alloc(char const	*str, char	c)
{
	if (!str)
		return (NULL);
	return ((char **)malloc(sizeof(char *) * (ft_word_cnt(str, c) + 1)));
}

char	**ft_split(char const *str, char c)
{
	        char	**res;
	unsigned int	i;
	        char	*from;

	res = ft_split_alloc(str, c);
	if (!res)
		return (NULL);
	i = 0;
	while (*str)
	{
		if (*str++ == c)
			continue ;
		from = (char *)str - 1;
		while (*str && *str != c)
			str++;
		res[i] = (char *)malloc(sizeof(char) * (str - from + 1));
		if (!(res[i]))
			return (ft_free(res));
		ft_strcpy(res[i++], from, str);
	}
	res[i] = NULL;
	return (res);
}

ft_itoa

숫자를 입력받아 이를 문자열로 표현하는 함수

malloc(3) 을 이용하여 메모리를 할당받은 후, 인자로 받은 정수를 나타내는 문자열을 반환합니다. 음수 또한 무조건 처리되어야 합니다.

틀린 이유 : int의 가장 작은 값이 -23ㅇ어짜고 처리안함 ㅜ

#include"libft.h"

int	get_divisor(int	n, int	*size)
{
	         int	divisor;
	unsigned int	nbr;

	*size = 1;
	if (n < 0)
	{
		++*size;
		nbr = -n;
	}
	else
		nbr = n;
	divisor = 1;
	while (nbr >= 10)
	{
		nbr /= 10;
		divisor *= 10;
		++*size;
	}
	return (divisor);
}

char	*ft_itoa(int	n)
{
	unsigned int	nbr;
	         int	divisor;
	         int	size;
	        char	*res;

	divisor = get_divisor(n, &size);
	res = (char *)malloc(sizeof(char) * (size + 1));
	if (!res)
		return (NULL);
	size = 0;
	nbr = n;
	if (n < 0)
	{
		res[size++] = '-';
		nbr = -n;
	}
	while (divisor > 0)
	{
		res[size++] = nbr / divisor + '0';
		nbr %= divisor;
		divisor /= 10;
	}
	res[size] = '\0';
	return (res);
}

ft_strmapi

char ft_strmapi(char const s, char (*f)(unsigned int, char))

ft_strmapi는 문자열 s를 함수 f에 적용시킨 새로운 문자열을 만들어서 리턴해주는 함수이다.

문자열 's' 의 각 문자를 순회하며 함수 'f'를 적용하고, 해당 문자의 인덱스를 함수 'f'의 첫 번째 인자로 사용합니다. 각 문자에 함수가 적용된 새로운 문자열을 생성합니다 (malloc(3) 을 이용하여 메모리를 할당)

#include"libft.h"

char	*ft_strmapi(char const	*s, char	(*f)(unsigned int, char))
{
	char	*res;
	size_t	i;
	size_t	len;

	if (!s)
		return (NULL);
	len = ft_strlen(s);
	res = (char *)malloc(sizeof(char) * (len + 1));
	if (!res)
		return (NULL);
	i = 0;
	while (s[i])
	{
		res[i] = (*f)(i, s[i]);
		i++;
	}
	res[i] = 0;
	return (res);
}

ft_striteri

void ft_striteri(char s, void (f)(unsigned int, char*))

문자열 's' 의 각 문자를 순회하며 함수 'f'를 적용하고, 해당 문자의 인덱스를 함수 'f'의 첫 번째 인자로 사용합니다. 또한 각 문자의 주소값이 'f' 함수의 두 번째 인자로 사용되며, 경우에 따라 수정될 수 있습니다.

#include"libft.h"

void	ft_striteri(char	*s, void	(*f)(unsigned int, char*))
{
	int	i;

	if (!s)
		return ;
	i = 0;
	while (*s)
	{
		(*f)(i, s);
		 s++;
		 i++;
	}
}

ft_putchar_fd

제공받은 파일 식별자에 문자 'c'를 출력합니다.

  • 파일 디스크립터는 0이 아닌 정수값(Non-negative Integer)을 갖는다.
  • 프로세스가 실행 중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터(FD)값을 이용해서 파일을 지칭할 수 있다.
  • 기본적으로 할당되는 파일 디스크럽터 0 : Standard input 1 : Standard Output 2 : Standard Error
#include"libft.h"

void	ft_putchar_fd(char	c, int	fd)
{
	if (fd < 0)
		return ;
	write (fd, &c, 1);
}

ft_putstr_fd

void ft_putstr_fd(char *s, int fd)

: 문자열 s를 주어진 파일디스크립터로 출력

제공받은 파일 식별자에 문자열 's'를 출력합니다.

#include"libft.h"

void	ft_putstr_fd(char	*s, int	fd)
{
	if (!s || fd < 0)
		return ;
	write (fd, s, ft_strlen(s));
}

ft_putendl_fd

제공받은 파일 식별자에 문자열 's'를 출력하고, 개행을 출력합니다.

#include"libft.h"

void	ft_putendl_fd(char	*s, int	fd)
{
	if (!s || fd < 0)
		return ;
	write (fd, s, ft_strlen(s));
	write (fd, "\n", 1);
}

ft_putnbr_fd

void ft_putnbr_fd(int n, int fd)

제공받은 파일 식별자에 정수 'n'를 출력합니다.

#include"libft.h"

void	ft_putnbr_fd(int	n, int	fd)
{
	unsigned int	nbr;

	nbr = n;
	if (n < 0)
	{
		nbr = -n;
		ft_putchar_fd('-', fd);
	}
	if (nbr >= 10)
		ft_putnbr_fd(nbr / 10, fd);
	ft_putchar_fd((nbr % 10) + '0', fd);
}
profile
코딩뿡뿡이

0개의 댓글