본문 바로가기
Algorithm/Algorithm

숫자를 write함수를 사용해 출력하기

by OdOp 관리자 2023. 10. 17.
SMALL

시작하기에 앞서서 write함수를 아직은 잘 모르시는 분들은 아래의 포스팅을 참고해 주시면 감사할 것 같습니다. 

https://hig0617.tistory.com/47

 

wirte함수는 문자형 왜에는 출력이 불가능합니다. 

따라서 숫자를 문자로 바꾸어야 합니다. 

ascii코드를 보면 아시겠지만 ascii코드에는 0부터 9까지의 숫자만 나타내어져 있고 10자리수 이상은 표현이 되어있지 않습니다. 

따라서 한자리씩 출력해야 하며 출력 순서 또한 가장 큰 자리수 먼저 진행을 해야합니다. 

예를 들어 135를 출력하게 된다면 

1 -> 3 -> 5순으로 출력을 진행하겠죠.

만약에 음수라면, '-'를 먼저 출력하고 숫자를 출력해야겠죠.

예를 들어 -135를 출력하게 된다면 

- -> 1 -> 3 -> 5순으로 출력할 것입니다. 

 

코드를 설명하기에 앞서서 재귀함수를 사용할 예정입니다. 아직은 잘 모르시는 분들은 아래의 포스팅을 참고해 주시면 좋을 것 같습니다.

https://hig0617.tistory.com/25

 

#include <unistd.h>

void putnbr(int nb)
{
    char c;

    if (nb < 0)
    {
        write(1, "-", 1);
        if (nb == -2147483648)
        {
            write(1, "2147483648", 10);
            return ;
        }
        nb *= -1;
    }
    if (nb > 9)
    {
        putnbr(nb / 10);
    }
    c = '0' + (nb % 10);
    write(1, &c, 1);
}

int main() {
    putnbr(42);
    write(1, "\n", 1);
    putnbr(-2147483648);
    write(1, "\n", 1);
    putnbr(-56);
    write(1, "\n", 1);
    putnbr(0);
    write(1, "\n", 1);
    return 0;
}

putnbr이 정수를 출력해주는 함수입니다. 

입력된 정수가 양수일때 먼저 생각해 보겠습니다.

한자리씩 출력하기 위해 입력된 수가 9보다 크면 10으로 나누어서 재귀를 진행하게 합니다. 

그렇게 되면 가장 큰 자리 수부터 출력이 되기 때문에 저희가 원하는 대로 출력이 됩니다. 

만약 음수이면 -를 출력합니다. 

음수이면서 int최소값인 -2147483648일 경우에 바로 2147483648을 츨력합니다. 왜냐하면 양수로 전환을 할 것인데 int 최댓값이 2147483647이여서 오버플로우가 일어나기 때문입니다. 출력을 완료했으면 함수를 종료시키기 위해 return을 합니다. 

양수로 변환시켜줍니다. 그리고 양수일 때와 마찬가지로 진행해 줍니다. 

 

LIST