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!

지금까지 알아본 서식 지정자, 플래그, 폭, 정밀도를 표로 정리했습니다.

표 85‑1 서식 지정자, 폭, 플래그, 정밀도
서식 지정자 설명
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+까지 폭에 포함됨
정밀도 설명
.숫자 지정한 숫자만큼 소수점 아래 자리 출력

다음은 자료형별로 서식 지정자에 지정할 수 있는 길이입니다.

표 85‑2 서식 지정자 길이
 

서식 지정자

길이

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