85.2 서식 지정자
printf, sprintf, fprintf에서 사용하는 서식 지정자(format specifier)는 다양한 활용법이 있습니다.
다음은 기본 서식 지정자이며 정수, 실수, 문자, 문자열, 포인터의 메모리 주소를 출력하는 기본 서식 지정자입니다.
format_specifier.c
// 정수 printf("%u\n", 10); // 10: 부호 없는 10진 정수 printf("%d\n", -20); // -20: 부호 있는 10진 정수 printf("%i\n", -20); // -20: 부호 있는 10진 정수 printf("%o\n", 071); // 71: 부호 없는 8진 정수 printf("%x\n", 0xF1); // f1: 부호 없는 16진 정수(소문자) printf("%X\n", 0xF1); // F1: 부호 없는 16진 정수(대문자) // long, long long 정수 printf("%lu\n", ULONG_MAX); // 4294967295: 부호 없는 long printf("%ld\n", LONG_MAX); // 2147483647: 부호 있는 long printf("%llu\n", ULLONG_MAX); // 18446744073709551615: 부호 없는 long long printf("%lld\n", LLONG_MAX); // 9223372036854775807: 부호 있는 long long // 실수 printf("%f\n", 1.2f); // 1.200000: 실수를 소수점으로 표기(소문자) printf("%F\n", 1.2f); // 1.200000: 실수를 소수점으로 표기(대문자) printf("%e\n", 1.2f); // 1.200000e+00: 실수 지수 표기법 사용(소문자) printf("%E\n", 1.2f); // 1.200000E+00: 실수 지수 표기법 사용(대문자) printf("%g\n", 1.2f); // 1.2: %f와 %e 중에서 짧은 것을 사용(소문자) printf("%G\n", 1.2f); // 1.2: %F와 %E 중에서 짧은 것을 사용(대문자) printf("%a\n", 1.2f); // 0x1.3333340000000p+0: 실수를 16진법으로 표기(소문자) printf("%A\n", 1.2f); // 0X1.3333340000000P+0: 실수를 16진법으로 표기(대문자) printf("%Lf", LDBL_MAX); // 생략: long double printf("%Le", LDBL_MAX); // 1.797693e+308: long double // 문자, 문자열 printf("%c\n", 'a'); // a: 문자 printf("%s\n", "Hello, world!"); // Hello, world!: 문자열 // 포인터 int num1; void *ptr = &num1; printf("%p\n", ptr); // 008BFB6C: 포인터의 메모리 주소 // 0x8bfb6c: 리눅스, OS X에서는 앞에 0x가 붙고, A~F는 소문자로 출력 // 높은 자릿수의 0은 생략 // % 기호 printf("%%\n"); // %: % 기호 출력
이제 이 기본 서식 지정자에 다양한 플래그, 폭, 정밀도, 길이를 조합해서 사용합니다.
- %[플래그][폭][.정밀도][길이]서식지정자
먼저 정수 서식 지정자 %d에 폭을 지정해보겠습니다. 다음과 같이 %와 d 사이에 숫자를 넣으면 출력 폭을 지정할 수 있습니다.
printf("%6d\n", 20); // %d의 출력 폭을 6칸으로 지정 printf("%6d\n", 2000); // %d의 출력 폭을 6칸으로 지정
폭을 6칸으로 지정했으므로 20 앞에는 공백이 4칸, 2000 앞에는 공백이 2칸 채워집니다. 즉, 출력할 숫자까지 포함하여 6칸입니다.
실행 결과
↓ 4칸 공백 20 2000 ↑ 2칸 공백
이번에는 폭과 플래그를 함께 써보겠습니다. 다음과 같이 폭 앞에 0을 넣으면 남는 공간에는 공백 대신 0으로 채웁니다.
printf("%06d\n", 20); // 출력 폭을 6칸으로 지정, 남는 공간은 0으로 채움 printf("%06d\n", 2000); // 출력 폭을 6칸으로 지정, 남는 공간은 0으로 채움
폭을 6칸, 남는 공간을 0으로 채우도록 했으므로 20 앞에는 0이 4개, 2000 앞에는 0이 2개 채워집니다.
실행 결과
↓ 0이 4개 채워짐 000020 002000 ↑ 0이 2개 채워짐
플래그 부분을 공백으로 지정하면 양수일 때는 부호를 출력하지 않고 공백으로 표시하고, 음수일 때는 - 부호를 출력합니다. 그리고 플래그를 +로 지정하면 양수일 때는 + 부호, 음수일 때는 - 부호를 출력합니다.
printf("% d\n", 10); // 양수일 때는 부호를 출력하지 않고 공백으로 표시 printf("% d\n", -10); // 음수일 때는 - 부호를 출력 printf("%+d\n", 200); // 양수일 때는 + 부호 출력 printf("%+d\n", -200); // 음수일 때는 - 부호 출력
실행 결과
10 -10 +200 -200
실수를 출력하는 %f, %e는 정밀도를 지정할 수 있습니다. 다음과 같이 %뒤에 . (점)과 숫자를 넣습니다.
printf("%.2f\n", 1.2f); // 소수 둘째 자리까지 출력 printf("%.2e\n", 1.2f); // 소수 둘째 자리까지 출력
정밀도를 .2로 지정했으므로 소수 둘째 자리까지 출력합니다.
실행 결과
1.20 1.20e+00
실수에 플래그, 폭, 정밀도를 함께 지정해보겠습니다.
printf("%010.2f\n", 1.2f); // 출력 폭은 10칸, 소수 둘째 자리까지 출력, 남는 공간은 0으로 채움 printf("%010.2e\n", 1.2f); // 출력 폭은 10칸, 소수 둘째 자리까지 출력, 남는 공간은 0으로 채움
출력 폭은 10칸으로 지정하고 소수 둘째 자리까지 출력에 남는 공간은 0으로 채웠습니다. 단, 실수는 폭에 소수점과 e+까지 포함합니다.
실행 결과
0000001.20 001.20e+00
8진수와 16진수를 출력할 때는 플래그로 #을 사용하면 자동으로 0이나, 0x, 0X를 앞에 붙여줍니다.
printf("%#o\n", 0721); // 8진수이면 앞에 0을 붙임 printf("%#x\n", 0xf1); // 16진수 소문자 출력이면 앞에 0x를 붙임 printf("%#X\n", 0xf1); // 16진수 대문자 출력이면 앞에 0X를 붙임
실행 결과
0721 0xf1 0XF1
문자와 문자열도 출력 폭을 지정할 수 있습니다.
printf("%20c\n", 'a'); // 출력 폭을 20칸으로 지정 printf("%20s\n", "Hello, world!"); // 출력 폭을 20칸으로 지정
실행 결과
a Hello, world!
지금까지 알아본 서식 지정자, 플래그, 폭, 정밀도를 표로 정리했습니다.
서식 지정자 | 설명 |
---|---|
d, i | 부호 있는 10진 정수 |
u | 부호 없는 10진 정수 |
o | 부호 없는 8진 정수 |
x | 부호 없는 16진 정수(소문자) |
X | 부호 없는 16진 정수(대문자) |
f | 실수를 소수점으로 표기(소문자) |
F | 실수를 소수점으로 표기(대문자) |
e | 실수 지수 표기법 사용(소문자) |
E | 실수 지수 표기법 사용(대문자) |
g | %f와 %e 중에서 짧은 것을 사용(소문자) |
G | %F와 %E 중에서 짧은 것을 사용(대문자) |
a | 실수를 16진법으로 표기(소문자) |
A | 실수를 16진법으로 표기(대문자) |
c | 문자 |
s | 문자열 |
p | 포인터의 메모리 주소 |
n | %n 부분에 int 포인터를 넣으면 지금까지 출력한 문자 개수를 변수에 넣어줌int num1; _set_printf_count_output(1); // Visual Studio에서 %n 활성화 printf("abcde%n\n", &num1); // num1의 주소(포인터)를 지정. // 지금까지 출력한 문자 개수를 num1에 넣어줌 printf("%d\n", num1); // 5: abcde는 5글자이므로 5가 들어가 있음 |
% | % 기호 출력 |
플래그 | 설명 |
- | 왼쪽 정렬 |
+ | 양수일 때는 + 부호, 음수일 때는 - 부호 출력 |
공백 | 양수일 때는 부호를 출력하지 않고 공백으로 표시, 음수 일 때는 - 부호 출력 |
# | 진법에 맞게 숫자 앞에 0, 0x, 0X를 붙임 |
0 | 출력하는 폭의 남는 공간에 0으로 채움 |
폭 | 설명 |
숫자 | 지정한 숫자만큼 폭을 지정하여 출력, 실수는 . (점), e+까지 폭에 포함됨 |
정밀도 | 설명 |
.숫자 | 지정한 숫자만큼 소수점 아래 자리 출력 |
다음은 자료형별로 서식 지정자에 지정할 수 있는 길이입니다.
서식 지정자 |
|||||||
---|---|---|---|---|---|---|---|
길이 | d i |
o u x X |
f F e g G a A |
c |
s |
p |
n |
int | unsigned int | float, double | int | char * | void * | int * | |
hh | signed char | unsigned char | signed char * | ||||
h | short int | unsigned short int | short int * | ||||
l | long int | unsigned long int | double | wint_t | wchar_t * | long int * | |
ll | long long int | unsigned long long int | long long int * | ||||
j | intmax_t | uintmax_t | intmax_t * | ||||
z | size_t | size_t | size_t * | ||||
t | ptrdiff_t | ptrdiff_t | ptrdiff_t * | ||||
L | long double |