c07 - KimTaebin-ai/study_posts GitHub Wiki

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ๋™์ ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ๋‹ค. ์–ด๋ ต์ง„ ์•Š๋‹ค.

c10์ „๊นŒ์ง€๋Š” ์‰ฝ๋‹ค๊ณ ํ•˜๋‹ˆ ํž๋งํ•˜๋ฉด์„œ ์ง„๋„ ๋ฐ€์ž.

๋™๋ฃŒํ•™์Šต๋„ ๋งŽ์ดํ•˜๊ณ  ๋Œ€ํ™”๋„ ๋” ๋” ๋งŽ์ด!!

ex00

#include <stdio.h>
#include <stdlib.h>

char	*ft_strdup(char *src)
{

	char	*result_str;
	int		len;
	int		i;

	len = 0;
	while (src[len] != '\0')
		len++;
	result_str = (char *)malloc(sizeof(char) * (len + 1));
	if (result_str == 0)
		return (0);
	i = 0;
	while (i < len)
	{
		result_str[i] = src[i];
		i++;
	}
	result_str[i] = '\0';
	return (result_str);
}

ex01

#include <stdlib.h>

int	*ft_range(int min, int max)
{
	int	*arr;
	int	range;
	int	i;

	i = 0;
	if (min >= max)
		return (0);
	range = max - min;
	arr = (int *)malloc(sizeof(int) * range);
	if (arr == 0)
		return (0);
	while (i < range)
		arr[i++] = min++;
	return (arr);
}

ex02

#include <stdlib.h>
#include <unistd.h>

int	ft_ultimate_range(int **range, int min, int max)
{
	int	*ptr;
	int	r;
	int	i;

	r = max - min;
	if (r <= 0)
		return (0);
	ptr = (int *)malloc(sizeof(int) * r);
	if (ptr == 0)
		return (0);
	i = 0;
	while (min < max)
		ptr[i++] = min++;
	*range = ptr;
	return (r);
}

ex03

#include <stdlib.h>

int	str_len(char *str)
{
	int	len;

	len = 0;
	while (str[len] != '\0')
		len++;
	return (len);
}

char	*str_cat(char *str1, char *str2)
{
	int	i;
	int	len;

	i = 0;
	len = 0;
	while (str1[len] != '\0')
		len++;
	while (str2[i] != '\0')
		str1[len++] = str2[i++];
	str1[len] = '\0';
	return (str1);
}

char	*ft_strjoin(int size, char **strs, char *sep)
{
	int		i;
	int		len;
	char	*result;

	i = 0;
	len = 0;
	while (i < size)
		len += str_len(strs[i++]);
	if (size > 0)
		len += (size - 1) * str_len(sep);
	result = (char *)malloc(sizeof(char) * (len + 1));
	result[0] = '\0';
	if (result == 0)
		return (0);
	i = 0;
	while (i < size)
	{
		result = str_cat(result, strs[i]);
		if (i < size - 1)
			result = str_cat(result, sep);
		i++;
	}
	result[len] = '\0';
	return (result);
}

์ด ํ•จ์ˆ˜๋Š” ๋‘๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ํ•ฉ์นœ๋‹ค.

ํ•ฉ์น ๋•Œ sep์„ ์ถ”๊ฐ€ํ•ด์„œ ํ•ฉ์นœ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ• ๋‹นํ•ด์•ผํ•  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” ๋ชจ๋“  ๋ฌธ์žฅ์˜ ๊ธธ์ด + (sep์˜ ๊ธธ์ด * ๋ฌธ์žฅ์˜ ๊ฐœ์ˆ˜-1)๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทผ๋ฐ ๋‚˜๋Š” ๊ทธ๋ƒฅ ์กฐ๊ธˆ ๋” ์—ฌ์œ ์žˆ๊ฒŒ ์žก์•„์ฃผ๊ณ  ๋„ ๋ฌธ์ž๋กœ ์ดˆ๊ธฐํ™”ํ•ด์คฌ๋‹ค.

ex04

#include <stdio.h>
#include <stdlib.h>

int		is_space(char c);
int		base_check(char *base);
int		find_base(char *base, char c);
int		nbr_len(int nbr, int len);

int	ft_atoi(char *str, char *base, int len)
{
	int	result;
	int	temp;

	result = 0;
	temp = 0;
	while (*str != '\0')
	{
		temp = find_base(base, *str++);
		if (temp < 0)
			break ;
		result = result * len + temp;
	}
	return (result);
}

int	ft_atoi_base(char *nbr, char *base)
{
	int	num;
	int	sign;
	int	len;

	num = 0;
	sign = 1;
	len = base_check(base);
	while (is_space(*nbr))
		nbr++;
	while (*nbr == '-' || *nbr == '+')
	{
		if (*nbr == '-')
			sign *= -1;
		nbr++;
	}
	num = ft_atoi(nbr, base, len);
	return (num * sign);
}

char	*ft_putnbr_base(int num, char *base, char *result, int len)
{
	int	i;
	int	temp;
	int	base_len;

	base_len = base_check(base);
	if (num == 0)
		result[0] = base[0];
	if (num < 0)
		result[0] = '-';
	i = len - 1;
	while (num != 0)
	{
		temp = num % base_len;
		if (temp < 0)
			temp *= -1;
		result[i] = base[temp];
		num /= base_len;
		i--;
	}
	result[len] = '\0';
	return (result);
}

char	*ft_convert_base(char *nbr, char *base_from, char *base_to)
{
	int		num;
	int		len;
	char	*result;

	if (base_check(base_from) < 2 || base_check(base_to) < 2)
		return (0);
	num = ft_atoi_base(nbr, base_from);
	len = nbr_len(num, base_check(base_to));
	result = (char *)malloc(sizeof(char) * (len + 1));
	if (result == 0)
		return (0);
	result = ft_putnbr_base(num, base_to, result, len);
	return (result);
}
int	is_space(char c)
{
	char	*space;

	space = " \n\t\v\f\r";
	while (*space != '\0')
	{
		if (c == *space)
			return (1);
		space++;
	}
	return (0);
}

int	base_check(char *base)
{
	int	len;
	int	i;
	int	j;

	len = 0;
	i = 0;
	j = 0;
	while (base[len] != '\0')
	{
		if (is_space(base[len]) || base[len] == '-' || base[len] == '+')
			return (0);
		len++;
	}
	while (i < len - 1)
	{
		j = i + 1;
		while (j < len)
		{
			if (base[i] == base[j])
				return (0);
			j++;
		}
		i++;
	}
	return (len);
}

int	find_base(char *base, char c)
{
	int	i;

	i = 0;
	while (base[i] != '\0')
	{
		if (base[i] == c)
			return (i);
		i++;
	}
	return (-1);
}

int	nbr_len(int nbr, int len)
{
	int	cnt;

	cnt = 0;
	if (nbr == 0)
		return (1);
	if (nbr < 0)
		cnt++;
	while (nbr != 0)
	{
		cnt++;
		nbr /= len;
	}
	return (cnt);
}

์ด ๋ฌธ์ œ๋Š” 04๋ฒˆ์˜ ์ง„๋ฒ•๋ณ€ํ™˜ ๋ฌธ์ œ๋ฅผ ๋™์ ํ• ๋‹น์œผ๋กœ ํ‘ธ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌธ์ œ๋ฅผ ์ฝ๋Š”๋ฐ ์ œ์ถœํ•ด์•ผํ•˜๋Š” ํŒŒ์ผ์ด 2๊ฐœ๋‹ค.

๋ฒŒ์จ ํ—ค๋”ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฑด๊ฐ€? ์ด์œ ๊ฐ€ ๋ญ”์ง€ ํ•œ์ฐธ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ...

norminette์—์„œ๋Š” ํ•œ ํŒŒ์ผ์•ˆ์— 5๊ฐœ ์ด์ƒ์˜ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—

๋‘๊ฐœ์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„ํ•˜๋ผ๊ณ  ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ ๊ทธ๋ƒฅ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์€ ๊ฑฐ ๋‹ค ์ง‘์–ด๋„ฃ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋ฐฐ๋ถ„ํ•ด์„œ ๋งŒ๋“ค๋ฉด๋œ๋‹ค.

norminette ๋„ค ์ดnorm;;

ex05

#include <stdlib.h>

int	sep(char c, char *sep)
{
	while (*sep != '\0')
	{
		if (*sep == c)
			return (1);
		sep++;
	}
	return (0);
}

char	*ft_str_dup(char *str, char *charset)
{
	char	*new_str;
	int		len;
	int		i;

	len = 0;
	while (str[len] != '\0' && !sep(str[len], charset))
		len++;
	new_str = (char *)malloc(sizeof(char) * (len + 1));
	if (new_str == 0)
		return (0);
	i = 0;
	while (i < len)
	{
		new_str[i] = str[i];
		i++;
	}
	new_str[i] = '\0';
	return (new_str);
}

int	count(char *str, char *charset)
{
	int	cnt;

	cnt = 0;
	while (*str != '\0')
	{
		if (!sep(*str, charset))
		{
			cnt++;
			while (!sep(*str, charset) && *str != '\0')
				str++;
		}
		else
			str++;
	}
	return (cnt);
}

char	**ft_split(char *str, char *charset)
{
	int		num;
	int		i;
	char	**result;

	num = count(str, charset);
	result = (char **)malloc(sizeof(char *) * (num + 1));
	if (result == 0)
		return (0);
	i = 0;
	while (*str != '\0')
	{
		if (!sep(*str, charset))
		{
			result[i++] = ft_str_dup(str, charset);
			while (!sep(*str, charset) && *str != '\0')
				str++;
		}
		else
			str++;
	}
	result[i] = 0;
	return (result);
}

์ด ํ•จ์ˆ˜๋Š” strjoin๊ณผ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜๋Œ€๋œ๋‹ค.

๊ตฌ๋ถ„์ž๋ฅผ ๋„ฃ๋Š”๊ฒƒ์—์„œ, ์ด๋ฏธ ๊ตฌ๋ถ„์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ๋นผ๋ฒ„๋ฆฐ ๋ฌธ์žฅ์œผ๋กœ ๋งŒ๋“ค๋ฉด๋œ๋‹ค.

์ด ๋•Œ strdup๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๊ตฌ๋ถ„์ž๋ฅผ ๋งŒ๋‚ ๋•Œ๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์„ ๋นˆ ๋ฌธ์ž์—ด์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์—์„œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ตฌ๋ถ„์ž๋ฅผ ๋งŒ๋‚ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ณ  ์ด๋ ‡๊ฒŒ ๋„ฃ์–ด์ค€ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ‰๊ฐ€ํ•˜๋ฉด์„œ ๋Œ์•„๋ณด๋‹ˆ strdup๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ๋ณธ๋Šฅ์ ์œผ๋กœ ๋– ์˜ฌ๋ฆฐ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค ์ข€ ์น˜์‹œ๋Š” ๋ถ„๋“ค์ธ ๊ฒƒ ๊ฐ™์€๋ฐ

๋‚˜๋„ ๊ทธ ๊ทธ๋ฃน์— ์†ํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๋‚ด์‹ฌ ๋ฟŒ๋“ฏํ–ˆ๋‹ค

โš ๏ธ **GitHub.com Fallback** โš ๏ธ