ft_putnbr_base.c

#include <unistd.h>

int ft_strlen(char *src)
{
    int cnt;

    cnt = 0;
    while (src[cnt] != '\\0')
    {
        cnt++;        
    }
    return (cnt);
}

void change_base(long long int nbr, char *base)
{
    char a;
    
    if ((nbr) >= ft_strlen(base))
    {
        change_base(nbr / ft_strlen(base), base);
        change_base(nbr % ft_strlen(base), base);
    }
    else
    {
        a = base[nbr];
        write(1, &a, 1);
    }
}

void ft_putnbr_base(int nbr, char *base)
{
    long long int nb;
    
    nb = nbr;
    if (nb >= 0)
    {
        change_base(nb, base);
    }
    else
    {
        nb = (-1) * nb;
        write(1, "-", 1);
        change_base(nb, base);
    }
}

int main(void)
{
    ft_putnbr_base(-2147483648, "poneyvif");
}

기계 채점 받았는데 floating exception이 발생했다. 아마도 base의 길이가 0일 때를 예외처리해야 하는 것 같다.

#include <unistd.h>

int ft_strlen(char *src)
{
    int cnt;

    cnt = 0;
    while (src[cnt] != '\\0')
    {
        cnt++;        
    }
    return (cnt);
}

int check_base(char *base)
{
    int i;
    int j;

    i = 0;
    if (ft_strlen(base) <= 1)
        return (0);
    while (i < ft_strlen(base) - 1)
    {
        j = i + 1;
        while (j < ft_strlen(base))
        {
            if (base[i] == base[j])
                return(0);
            if ((base[i] == '-' || base [i] == '+') || (base[j] == '-' || base [j] == '+'))
                return(0);
            if ((9 <= base[i] && base[i] <= 13) || (base[i] == 32) || (9 <= base[i] && base[i] <= 13) || (base[i] == 32))
                return(0);
            j++;
        }
        i++;
    }
}

void change_base(long long int nbr, char *base)
{
    char a;
    
    if ((nbr) >= ft_strlen(base))
    {
        change_base(nbr / ft_strlen(base), base);
        change_base(nbr % ft_strlen(base), base);
    }
    else
    {
        a = base[nbr];
        write(1, &a, 1);
    }
}

void ft_putnbr_base(int nbr, char *base)
{
    long long int nb;
    
    nb = nbr;
    if (check_base(base) == 0)
        write(1, "\\0", 1);
    else if (nb >= 0)
    {
        change_base(nb, base);
    }
    else
    {
        nb = (-1) * nb;
        write(1, "-", 1);
        change_base(nb, base);
    }
}

int main(void)
{
    ft_putnbr_base(-2147483648, " poneyvif");
}

코드를 수정해봤는데 이거는 백프로 norminette에 걸릴 것 같다.

함수를 하나 더 만들어봐야 하나…? 근데 화이트 스페이스도 필터 조건에 넣어야 할지는 잘 모르겠다.

최종 코드(라고 생각)

#include <unistd.h>

int ft_strlen(char *src)
{
    int cnt;

    cnt = 0;
    while (src[cnt] != '\\0')
    {
        cnt++;        
    }
    return (cnt);
}

int check_base01(char *base)
{
    int i;
    int j;

    i = 0;
    if (ft_strlen(base) <= 1)
        return (0);
    while (i < ft_strlen(base) - 1)
    {
        j = i + 1;
        while (j < ft_strlen(base))
        {
            if (base[i] == base[j])
                return(0);
            j++;
        }
        i++;
    }
}

int check_base02(char *base)
{
    int i;
    int j;

    i = 0;
    while (i < ft_strlen(base) - 1)
    {
        j = i + 1;
        while (j < ft_strlen(base))
        {
            if (base[i] == '-' || base [i] == '+')
                return(0);
            if (base[j] == '-' || base [j] == '+')
                return (0);
            if ((9 <= base[i] && base[i] <= 13) || (base[i] == 32))
                return(0);
            if ((9 <= base[j] && base[j] <= 13) || (base[j] == 32))
                return (0);
            j++;
        }
        i++;
    }
}

void change_base(long long int nbr, char *base)
{
    char a;
    
    if ((nbr) >= ft_strlen(base))
    {
        change_base(nbr / ft_strlen(base), base);
        change_base(nbr % ft_strlen(base), base);
    }
    else
    {
        a = base[nbr];
        write(1, &a, 1);
    }
}

void ft_putnbr_base(int nbr, char *base)
{
    long long int nb;
    
    nb = nbr;
    if (check_base01(base) == 0 || check_base02(base) == 0)
        write(1, "\\0", 1);
    else if (nb >= 0)
    {
        change_base(nb, base);
    }
    else
    {
        nb = (-1) * nb;
        write(1, "-", 1);
        change_base(nb, base);
    }
}

int main(void)
{
    ft_putnbr_base(-2147483648, "0123456789");
}