열렬히.뛰기

c04

école 42 > C > c04

ex03 = ft_atoi

c

#include <unistd.h>

int find_num_length(char *str)
{
    int n;
    
    n = 0;
    while (!(str[n] >= '0' && str[n] <= '9')) 
        n++;
    return (n);
}
void    print_rev_num(char *reversed) 
{
    while(*reversed != '\0')
        write(1, reversed, 1);
        reversed++;
}
void    make_rev_num(char *str, char sign, int n) 
{
    int                 i;
    char    reversed[n + 1];
    int                 x;

    reversed[0] = sign;
    reversed[n + 1] = '\0';
    while (n > 0)
    {
        reversed[n] = str[i];
        n--;
        i++;
    }
    print_rev_num(reversed);
}
int ft_atoi(char *str)
{
    int sign;
    int num;
    
    sign = 1;
    while(*str != '\0')
    {
        if ((*str >= 9 && *str <= 13) || *str == 32)
        {
            str++;
            continue ;
        }
        else if (*str == '+' || *str == '-') 
        {
            if (*str == '+')
                sign *= 1;
            else
                sign *= -1;
            str++;
        }
        else if (*str >= '0' && *str <= '9')
            make_rev_num(str, sign, find_num_length(str));
    }
}

int main() 
{
    char *a = "  ---+--+1234ab567";
    ft_atoi(a);
}

ex04 = ft_putnbr_base

c
#include <unistd.h>

int	find_same(char *str, char ch, int v)
{
	while (str[v] != '\0')
	{
		if (str[v] == ch)
			return (1);
		v++;
	}
	return (0);
}

int	checkdigit(char *base)
{
	int	i;

	if (!*base || base[1] == '\0')
		return (0);
	i = 0;
	while (base[i] != '\0')
	{
		if (base[i] == 43 || base[i] == 45)
			return (0);
		else if (find_same(base, base[i], i + 1) == 1)
			return (0);
		i++;
	}
	return (1);
}

int	len(char *str)
{
	int	i;

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

void	write_base(long long x, char *str, int n)
{
	if (x < 0)
	{
		write(1, "-", 1);
		write_base(-x, str, n);
	}
	else if (x < n)
		write(1, &str[x], 1);
	else
	{
		write_base(x / n, str, n);
		write_base(x % n, str, n);
	}
}

void	ft_putnbr_base(int nbr, char *base)
{
	if (checkdigit(base) == 0)
		return ;
	write_base((long long)nbr, base, len(base));
}

ex05 = ft_atoi_base

c
int	insider(char ch, char *base)
{
	int	i;

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

int	len(char *base)
{
	int	i;

	i = 0;
	while (base[i] != '\0')
		i++;
	return (i);
}

int	checkminus(char *str)
{
	int	flag;

	flag = 0;
	while ((*str >= 9 && *str <= 13) || *str == 32)
		str++;
	while (*str == '-' || *str == '+')
	{
		if (*str == '-')
			flag++;
		str++;
	}
	return (flag % 2);
}

int	checkbase(char *base)
{
	int	i;
	int	temp;

	i = 0;
	while (base[i] != '\0')
	{
		temp = 1;
		if (base[i] == '+' || base[i] == '-')
			return (0);
		else if ((base[i] >= 9 && base[i] <= 13) || base[i] == 32)
			return (0);
		while (temp <= i)
		{
			if (base[i] == base[i - temp])
				return (0);
			temp++;
		}
		i++;
	}
	return (1);
}

int	ft_atoi_base(char *str, char *base)
{
	int	i;
	int	sign;
	int	number;

	i = 0;
	sign = 1;
	if (checkbase(base) == 0)
		return (0);
	if (checkminus(str) == 1)
		sign = -1;
	while ((str[i] >= 9 && str[i] <= 13) || str[i] == 32)
		i++;
	while (str[i] == '-' || str[i] == '+')
		i++;
	number = 0;
	while (insider(str[i], base) != -1 && str[i] != '\0')
	{
		number *= len(base);
		number += insider(str[i], base);
		i++;
	}
	return (sign * number);
}