본문 바로가기
Language/C언어

C039_putnbr만들기

by OdOp 관리자 2023. 12. 6.
SMALL

write함수만을 사용해서 정수형을 출력해 보도록 하겠습니다. 

 

 

OdOp_putnbr

#include <unistd.h>

void    OdOp_putnbr(int nb)
{
    char    c;
    int        i;

    if (nb == -2147483648)
    {
        write(1, "-2147483648", 11);
        return ;
    }
    else if (nb < 0)
    {
        nb = -nb;
        write(1, "-", 1);
    }
    while (nb > 9)
    {
        i = nb / 10;
        OdOp_putnbr(i);
        nb = nb % 10;
    }
    c = nb + 48;
    write(1, &c, 1);
}

우선 overflow가 나올 수 있는 부분을 처리해 주었습니다. 

정수형 최솟값인 '-2147483648'을 양수로 바꾸게 된다면 overflow가 됩니다. 이를 방지하여 만약 정수 최솟값이 입력이 된다면 바록 '-2147483648'을 출력하게 했습니다. 

 

입력받은 수 nb가 음수라면 -을 출력하고 양수로 변환해 주었습니다. 

 

while이 9보다 클 때 재귀함수를 사용해 가장 큰 자릿수를 먼저 출력하게 만들어 주었습니다. 

(재귀함수가 아직 익숙하지 않으신 분은 이링크를 참고해 주시길 바랍니다. https://hig0617.tistory.com/25)

 

출력할 때에 write함수를 사용해야 하는데 이는 char 자료형 외에는 출력하지 못합니다.

(write함수가 아직 익숙하지 않으신 분은 이링크를 참고해 주시길 바랍니다. https://hig0617.tistory.com/47)

 

ascii코드를 사용하여 char자료형을 출력하겠습니다. 

(ascii코드가 아직은 무엇인지 잘 모르시는 분들은 이 링크를 참고해 주시길 바랍니다. https://hig0617.tistory.com/5)

 

이렇게 하면 가장 큰 자릿수 먼저 출력되게 됩니다.

 

 

예시를 보면서 어떻게 작동되는지 직접 숫자를 넣어서 살펴보도록 하겠습니다. 

#include <unistd.h>

void    OdOp_putnbr(int nb)
{
    char    c;
    int        i;

    if (nb == -2147483648)
    {
        write(1, "-2147483648", 11);
        return ;
    }
    else if (nb < 0)
    {
        nb = -nb;
        write(1, "-", 1);
    }
    while (nb > 9)
    {
        i = nb / 10;
        OdOp_putnbr(i);
        nb = nb % 10;
    }
    c = nb + 48;
    write(1, &c, 1);
}

int main(void)
{
    OdOp_putnbr(249);
    write(1, "\n", 1);
    OdOp_putnbr(42);
    write(1, "\n", 1);
    OdOp_putnbr(-2147483648);
    write(1, "\n", 1);
    OdOp_putnbr(-42);
    return (0);
}

249로 예를 들어보겠습니다. 

 

음수 최솟값도 음수도 아니기 때문에 if문과 else if문은 넘어갑니다. 

 

249는 9보다 크기 때문에 이를 10으로 나누고 다시 24로 재귀를 돌립니다. 

24 또한 9보다 크기 때문에 2로 재귀를 돌립니다. 

그러면 OdOp_putnbr(249), OdOp_putnbr(24), OdOp_putnbr(2)가 역순으로 진행되어야 합니다. 

 

OdOp_putnbr(2)는 while문에 들어가지 않기 때문에 ascii코드로 연산해 '2'를 출력합니다. 

OdOp_putnbr(24)는 while문에 들어가 있습니다. 10으로 나누어서 나머지를 다시 nb에 저장하면 while문을 더이상 돌지 않게 됩니다. 그 후에 마찬가지로 ascii코드로 연산해 '4'를 출력합니다. 

OdOp_putnbr(249) 역시 마찬가지의 방식으로 '9'를 출력합니다. 

그렇게 '249'를 출력합니다. 

LIST