플래그, 폭, 정밀도에 따라서 서식문자의 출력이 어떻게 변화하는지 알아보도록 합시다.
저는 보너스 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, "