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먼저 합시다..!