각 옵션마다 특이사항이 있어서 어떤식으로 구현하였는지 정리해 보았다
char 하나만 출력하는 옵션으로 '-'플래그를 체크하고 공백이 먼저 나올지 문자가 먼저나올지 분리해 주었다
str을 출력하는 옵션이다
str이 NULL일때는 (null) 총 6바이트가 출력되어야 한다
입력
#include <stdio.h>
int main()
{
printf("%d\n\n", printf("%s\n", NULL));
printf("%d\n\n", printf("%8s\n", NULL));
printf("%d\n\n", printf("%4s\n", NULL));
printf("%d\n\n", printf("%4.2s\n", NULL));
printf("%d\n\n", printf("%.s\n", NULL));
}
출력
(null)
7
(null)
9
(null)
7
(n
5
1
출력되는 (null)을 precision, wide 값에 따라 조정해야한다
그렇기 때문에
precision이 존재 하는지 없는지에 따라 두가지 케이스로 나누고 출력해주었다
그 외에는 '-' 플래그 존재 여부에 따라 두가지로 나누고 문자의 길이와 precision값을 비교하여 긴쪽을 기준으로 잡아 출력해주었다
입력
#include <stdio.h>
int main()
{
printf("%d\n\n", printf("%s\n", "hello"));
printf("%d\n\n", printf("%8s\n", "hello"));
printf("%d\n\n", printf("%4s\n", "hello"));
printf("%d\n\n", printf("%4.2s\n", "hello"));
printf("%d\n\n", printf("%.s\n", "hello"));
}
출력
hello
6
hello
9
hello
6
he
5
1
pointer 가 null을 가르킬때 0x0 출력을 따로 빼주었고 그 외에는 컨버트 베이스를 이용하여서 16진수로 바꿔주었다
로직은 플래그와 각종옵션을 바탕으로 정보 가공을 하고
wide에 따라 출력 크기를 정해주었다
특이하게도 가변인자의 값이 0일때 예외케이스들이 있어서 따로 빼주었다
입력
#include <stdio.h>
int main()
{
printf("%d\n\n", printf("%+.d\n", 0));
printf("%d\n\n", printf("% d\n", 0));
printf("%d\n\n", printf("% .d\n", 0));
printf("%d\n\n", printf("%+d\n", 0));
printf("%d\n\n", printf("%d\n", 0));
}
출력
+
2
0
3
2
+0
3
0
2
단순히 unsigned형으로 받아주고 부호관련기능을 뺐다
똑같은 로직이다 단순히 대문자 소문자 구분을 해주었고 #옵션을 넣게되면 그만큼 길이가 길어지도록 만들었다