ft_printf(4) %d
- 저는 len과 prec을 먼저 처리하고 그다음 width를 비교하는 순서를 선택했습니다.
- 가변인자를 문자열로 변환 시킨 후 길이: len으로 명명하겠습니다.
- len과 prec을 처리한 문자열을 disp라고 명명하겠습니다.
- 사용 가능한 플래그: '+-0 '
unsigned number case
- '+0 ' 플래그가 켜져있지 않는 경우입니다. ('+ '가 켜져있는 경우는 signed로 취급)
- 아래 d는 [int d = 4242]로 초기화 했습니다.
- case1: len > width, no prec: 가변인자 모두 출력합니다.
(기본적으로 len보다 width가 크다면, width를 무시하고 len 모두 출력)
printf("case1\n");
result_f = ft_printf("-->|%2d|<--\n", d);
result_r = printf("-->|%2d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case1
-->|4242|<--
-->|4242|<--
result_f = 13
result_r = 13
- case2: len < width, no prec: len 출력 후 남는 공간 공백으로 채웁니다.
('-'플래그 있으면 왼쪽정렬, 없으면 오른쪽 정렬)
printf("case2\n");
result_f = ft_printf("-->|%8d|<--\n", d);
result_r = printf("-->|%8d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case2
-->| 4242|<--
-->| 4242|<--
result_f = 17
result_r = 17
- case3: len > prec, no width: 숫자의 경우에서는 prec이 len 보다 작을 때, 무시됩니다.
(따라서, disp_len은 출력될 숫자의 길이인 len과 동일합니다.)
printf("case3\n");
result_f = ft_printf("-->|%.3d|<--\n", d);
result_r = printf("-->|%.3d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case3
-->|4242|<--
-->|4242|<--
result_f = 13
result_r = 13
- case4: len > prec, width < disp_len: case1과 같이 width가 무시됩니다.
printf("case4\n");
result_f = ft_printf("-->|%1.1d|<--\n", d);
result_r = printf("-->|%1.1d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case4
-->|4242|<--
-->|4242|<--
result_f = 13
result_r = 13
- case5: len > prec, width > disp_len: 3과 같이 남는 공간을 공백으로 채웁니다.
printf("case5\n");
result_f = ft_printf("-->|%6.3d|<--\n", d);
result_r = printf("-->|%6.3d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case5
-->| 4242|<--
-->| 4242|<--
result_f = 15
result_r = 15
- case6: len < prec, no width: (prec - len)만큼을 제로패딩합니다.
(이하는 제로패딩까지 마무리한 글자의 길이를 disp_len이라고 명명하겠습니다.)
printf("case6\n");
result_f = ft_printf("-->|%.7d|<--\n", d);
result_r = printf("-->|%.7d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case6
-->|0004242|<--
-->|0004242|<--
result_f = 16
result_r = 16
- case7: len < prec, width < disp_len : 출력해야할 문자열보다 width가 작으므로, 4처럼 출력합니다.
printf("case7\n");
result_f = ft_printf("-->|%4.7d|<--\n", d);
result_r = printf("-->|%4.7d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case7
-->|0004242|<--
-->|0004242|<--
result_f = 16
result_r = 16
- case8: len < prec, width > disp_len : 출력해야할 문자열보다 width가 크므로, 5처럼 출력합니다.
printf("case8\n");
result_f = ft_printf("-->|%10.7d|<--\n", d);
result_r = printf("-->|%10.7d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case8
-->| 0004242|<--
-->| 0004242|<--
result_f = 19
result_r = 19
signed number case
- '+ ' 플래그가 켜져있지 않는 경우도 포함합니다.
- 아래 d는 [int d = -4242]로 초기화 했습니다.
- 단, 아래 예시의 |-4242|는 '+' 플래그가 켜져있고, d가 양수라면 +4242로,
' ' 플래그가 켜져있고, d가 양수라면 | 4242|로 치환하여 생각하면 됩니다.
- case1 ~ case5까지는 위의 결과(unsigned number)와 동일합니다.
(단, 부호를 붙인 후, 수를 연이어 출력합니다.)
- case6: len < prec, no width: 부호를 먼저 쓰고, (prec - len + 1)만큼 제로패딩합니다.
(이하는 제로패딩까지 마무리한 숫자의 길이를 disp_len이라고 명명하겠습니다.)
printf("case6\n");
result_f = ft_printf("-->|%.7d|<--\n", d);
result_r = printf("-->|%.7d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case6
-->|-0004242|<--
-->|-0004242|<--
result_f = 17
result_r = 17
- case7: len < prec, width < disp_len : 출력해야할 문자열보다 width가 작으므로, 4처럼 출력합니다.
printf("case7\n");
result_f = ft_printf("-->|%4.7d|<--\n", d);
result_r = printf("-->|%4.7d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case7
-->|-0004242|<--
-->|-0004242|<--
result_f = 17
result_r = 17
- case8: len < prec, width > disp_len : 출력해야할 문자열보다 width가 크므로, 5처럼 출력합니다.
printf("case8\n");
result_f = ft_printf("-->|%10.7d|<--\n", d);
result_r = printf("-->|%10.7d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case8
-->| -0004242|<--
-->| -0004242|<--
result_f = 19
result_r = 19
zero flag case
- 아래 d는 [int d = -4242]로 초기화 했습니다.
- 단, 아래 예시의 |-4242|는 '+' 플래그가 켜져있고, d가 양수라면 +4242로,
' ' 플래그가 켜져있고, d가 양수라면 | 4242|로 치환하여 생각하면 됩니다.
- zero flag와 prec이 같이 있는 경우, zero flag는 무시됩니다. 따라서, 대부분의 경우
zero flag는 신경쓰지 않아도 됩니다.
- zero flag는 기본적으로 여백을 0으로 채웁니다. 따라서, width가 disp_len보다 큰 경우에
제로패딩 합니다. (이하는 zero flag가 적용되는 경우들을 나열하겠습니다)
- case1: len < width, no prec: len 출력 후 남는 공간을 '0'으로 채웁니다.
(부호가 있는 경우, 부호-제로패딩-숫자 순서로 출력. '-'플래그는 동시 사용 불가.)
printf("case2\n");
result_f = ft_printf("-->|%08d|<--\n", d);
result_r = printf("-->|%08d|<--\n", d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case2
-->|-0004242|<--
-->|-0004242|<--
result_f = 17
result_r = 17
asterisk case
- case1: width가 *인 경우, 가변인자가 음수일 때, '-' 플래그를 켭니다.
printf("case1\n");
result_f = ft_printf("-->|%*d|<--\n", -6, d);
result_r = printf("-->|%*d|<--\n", -6, d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case1
-->|-4242 |<--
-->|-4242 |<--
result_f = 15
result_r = 15
- case2: width가 *인 경우, '0' flag가 켜져있고, 가변인자가 양수일 때,
[zero flag] case1의 경우와 같습니다.
printf("case2\n");
result_f = ft_printf("-->|%0*d|<--\n", 6, d);
result_r = printf("-->|%0*d|<--\n", 6, d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case2
-->|-04242|<--
-->|-04242|<--
result_f = 15
result_r = 15
- case3: width가 *인 경우, '0' flag가 켜져있고, 가변인자가 음수일 때 '-' 플래그를 켭니다.
('0' flag와 '-' flag가 같이 켜져있는 경우, '-'가 우선인 것 같습니다. flag는 무시합니다.)
printf("case3\n");
result_f = ft_printf("-->|%0*d|<--\n", -6, d);
result_r = printf("-->|%0*d|<--\n", -6, d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case3
-->|-4242 |<--
-->|-4242 |<--
result_f = 15
result_r = 15
- case4: prec이 *인 경우, 가변인자가 양수면 기존과 같이 출력되고, 음수이면 없는 것으로 취급됩니다.
('0' flag와 '-' flag가 같이 켜져있는 경우, '-'가 우선인 것 같습니다. flag는 무시합니다.)
printf("case4\n");
result_f = ft_printf("-->|%.*d|<--\n", -5, d);
result_r = printf("-->|%.*d|<--\n", -5, d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case4
-->|-4242|<--
-->|-4242|<--
result_f = 14
result_r = 14
- case5: prec이 *인 경우, '0' flag가 켜져있을 때, 가변인자가 양수면 위와 같이 '0' 플래그는
무시되지만, 가변인자가 음수이면, prec이 없는 것과 같이 작동합니다.
printf("case5\n");
result_f = ft_printf("-->|%010.*d|<--\n", -5, d);
result_r = printf("-->|%010.*d|<--\n", -5, d);
printf("result_f = %d\nresult_r = %d\n\n", result_f, result_r);
case5
-->|-000004242|<--
-->|-000004242|<--
result_f = 19
result_r = 19