[ft_printf] 형식패턴에 따른 값의 변화

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

42Seoul

목록 보기
8/45

플래그, 폭, 정밀도에 따라서 서식문자의 출력이 어떻게 변화하는지 알아보도록 합시다.

저는 보너스 f,g,e를 하지 않아서 해당 부분은 제외하고 정리하도록 할게요.

1. 플래그

  • 우리가 구현해야할 플래그의 종류는 총 5개로 기본 2개("-0") 보너스 3개("# +")입니다.

  • 기본 플래그와 보너스 플래그는 중복이 가능한데 기본 플래그의 중복, 보너스 플래그의 중복은 무시되거나, 작동이 안 됩니다.

    각 서식문자별로 플래그가 적용 되는지 아래 표를 보면서 서식문자별 플래그의 용도를 알아보도록 합시다.

1.1 플래그 '-'

  • 플래그 '-'는 모든 서식문자에 동일하게 적용됩니다.
  • 폭(width)와 함께 작동하고 좌측정렬로 출력하라는 뜻이구요.
    ex) printf("%-5d", 123);
 "123  "

1.2 플래그 '0'

  • 플래그 '0'은 폭(width)로인해 출력되는 공백을 0으로 바꿔서 출력해줍니다.
    ex) printf("%05d", 123);
 "00123"
  • 만약 '-'플래그와 같이 있다면 플래그 '0'은 무시됩니다.
    ex) printf("%-05d", 123);
 "123  "
  • 정밀도가 있다면 플래그 '0'은 무시됩니다.
    ex) printf("%05.d", 1);
 "    1"

1.3 보너스 플래그 '#'

  • 플래그 '#'은 보너스 파트로써 정수를 16진수로 출력하는 x, X값 앞에 각각 0x, 0X를 붙여주는 플래그 입니다.
    ex) printf("%#x", 123);
 "0x7b"
  • 기본플래그와 중복이 가능합니다.
    ex) printf("%0#5X", 123);
 "0X07b"

1.4 보너스 플래그 ' '

  • 플래그 ' '은 정수 앞에 기호가 붙지 않는다면 공백을 한 칸 출력해 줍니다.
    ex) printf("% d", 123);
 " 123"
  • 기본플래그와 중복이 가능합니다.
    ex) printf("%0 5d", 123);
 " 0123"

1.5 보너스 플래그 '+'

  • 플래그 '+'는 정수의 부호를 붙여서 출력해줍니다.
    ex) printf("%+d", 123);
 "+123"
  • 기본 플래그와 중복이 가능합니다.
    ex) printf("%0+5d, 123);
 "+0123"

2. 폭(width)

  • 폭은 출력할 문자열의 총 길이의 최솟값을 지정해서 출력합니다.
    ex) printf("%5d", 123);
"  123"

폭은 5인데 우리가 출력하는건 123으로 총 길이가 3이죠. 그럼 부족한 2칸은 공백으로 채워주는 것입니다.
만약 printf("%2d", 123)으로 폭이 출력될 값의 길이 이하라면 어떻게 될까요??

"123"

폭은 출력될 값의 길이가 폭보다 작을때 사용되기에 값의 길이가 더 크면 폭은 무시됩니다.

  • 우선순위가 가장 낮다고 생각하면 편해요. 플래그, 출력 값, 정밀도 등 모든 값이 출력되고 난 뒤 남은 부분을 공백으로 채우는 방식이죠.
  • 값을 가변인자로 받아올 수 있습니다. 그럴땐 정수가 아니라 '*'을 사용합니다.
    ex) printf("%*d", 5, 123);
"  123"
  • 0이상의 값이 올 수 있습니다. 중요한건 아니지만 플래그 '0'과 혼동하지 말자구요. printf("%00d")같은거만 아니면 0은 플래그 '0'입니다.

3. 정밀도(precision)

  • 정수와 함께 사용하면 폭과 비슷하게 출력의 최솟값이 정해지는데 폭은 모든 값에 영향을 받았지만 정밀도는 서식문자에 출력에만 영향을 받고, 폭은 ' '을 출력하는데 정밀도는 '0'을 출력합니다.
    ex) printf("%.5d, %+.5d",123);
"00123, +00123"
  • 정밀도는 항상 '.'뒤에 나오고, '.'만 사용할 수도 있습니다.
    ex) printf("%5.5d, %5.d", 123, 123);
"00123,   123"
  • 값을 가변인자로 받아올 수 있습니다. 그럴땐 정수가 아니라 '*'을 사용합니다.
    ex) printf("%.*d", 5, 123);
"00123"
  • 서식문자 %c는 정밀도를 사용하지 않는습니다.
  • 서식문자 %s는 정밀도를 조금 다르게 사용합니다. 정수에서는 최솟값이었다면 %s에서는 최댓값이라고 생각하면 될 것 같아요.
    ex) printf("%.2s, %.0s", "123");
 "12, "

0개의 댓글