[42 Seoul] ft_printf(4) type d

yamkim·2020년 11월 1일
0

42Cursus-ft_printf

목록 보기
4/5

ft_printf(4) %d

%d의 format

  • 저는 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);

	//result ======================================================
	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);
 
	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	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);

	//result ======================================================
	case5
	-->|-000004242|<--
	-->|-000004242|<--
	result_f = 19
	result_r = 19

0개의 댓글