[ft_printf] 각 서식문자의 예외처리에 대해 알아보자

개발하는 곰댕이·2021년 4월 13일
0

42Seoul

목록 보기
9/45

1. %c

  • c는 크게 어려운 부분이 없이 구현하면 되는데 한 가지만 알아둬야 합니다. 출력 값이 '\0'이 넘어와도 출력을 하고 카운트를 해야합니다.
    물론 그냥 출력하면 되지만 저는 서식문자의 출력값을 모두 문자열로 만든 뒤 하나의 함수로 모든 서식문자를 출력했다보니 출력이 안돼서 직접 출력을 해 줬어야 했습니다.
 write(1, info->variable, ft_strlen(info->variable)); // 내가 출력한 방식

만약 저 처럼 모든 서식문자의 출력을 하나의 함수에서 출력한다면 따로 처리를 해 주세요!
그렇지 않고 그냥 각 서식문자마다 개별적으로 출력한다면 크게 신경쓰지 않아도 되는 부분인 것 같으니 알고만 넘어가면 될 것 같습니다.

2. %s

  • 이전 정밀도 부분에서 말했 듯 정밀도에 따라서 값이 덜 출력될 수 있습니다.
    ex) printf("%.2s, %.0s", "123");
 "12, "
  • 만약 NULL포인터가 넘어왔다면 (null)을 출력해 줘야합니다.
    물론 이 문자열 "(null)"도 정밀도의 영향을 받구요.

3. %p

  • 포인터는 크게 주의할 점은 없는데 만약 itoa_base에서 매개변수로 int를 받으면 값이 잘못 출력될 수 있습니다. 포인터의 크기는 각 운영체제 및 환경에 따라 다른데 sizeof로 출력을 해 보면 32비트는 4byte, 64비트 운영체제는 8byte가 나올 거에요. 그렇기 때문에 저는 size_t를 사용했습니다.

  • NULL포인터가 나온다면 0x0을 출력해 주어야 합니다. 이 부분도 별로 중요하진 않아서 구현할 때 알아두기만 한다면 될 것같아요.

4. %d, %i

  • 정밀도가 0일때 정수 서식문자 출력값이 0이면 출력하지 않습니다.
    ex) printf("%.0d", 0);
  • 정수는 #을 제외하고 모든 플래그가 적용이 가능하기에 출력을 할 때 고려해야할 부분이 많아요. 이 부분은 구현할 때 출력을 어떤 방식으로 하느냐에 따라 다르기에 printf함수와 비교를 많이 해 보면서 하길 추천합니다.
    이 서식문자 구현하는게 가장 복잡해요...

5. %u

  • %d, %i만 먼저 구현한다면 큰 어려움 없이 출력이 가능합니다.

6. %x, %X

  • 출력값이 0일 때 보너스플래그 '#'은 적용되지 않습니다.
    ex) printf("%#x, %#x", 1, 0);
"0x1, 0"

사실 %d, %i 출력부분만 구현을 했다면 다른 녀석들은 큰 무리가 없이 구현이 가능하기 때문에 %d, %i먼저 합시다..!

0개의 댓글