Skip to content

76. 서식 지정자(Format Specifier)


1. 키워드

  • 서식 지정자(Format Specifier)


2. 서식 지정자

  • printf, sprintf, fprintf에서 사용하는 서식 지정자는 다양한 활용법이 있다.


  • 다음은 기본 서식 지정자이며 정수, 실수, 문자, 문자열, 포인터의 메모리 주소를 출력하는 기본 서식 지정자이다.


// 정수
printf("%u\n", 10);   // 부호 없는 10진 정수
printf("%d\n", -20);  // 부호 있는 10진 정수
printf("%i\n", -20);  // 부호 있는 10진 정수
printf("%o\n", 071);  // 부호 없는 8진 정수
printf("%x\n", 0xF1); // 부호 없는 16진 정수(소문자)
printf("%X\n", 0xF1); // 부호 없는 16진 정수(대문자)

// long, long long 타입 정수
printf("%lu\n", ULONG_MAX);   // 부호 없는 long 타입
printf("%ld\n", LONG_MAX);    // 부호 있는 long 타입
printf("%llu\n", ULLONG_MAX); // 부호 없는 long long 타입
printf("%lld\n", LLONG_MAX);  // 부호 있는 long long 타입

// 실수
printf("%f\n", 1.2f); // 실수를 소수점으로 표기(소문자)
printf("%F\n", 1.2f); // 실수를 소수점으로 표기(대문자)
printf("%e\n", 1.2f); // 실수 지수 표기법 사용(소문자)
printf("%E\n", 1.2f); // 실수 지수 표기법 사용(대문자)
printf("%g\n", 1.2f); // %f와 %e 중에서 짧은 것을 사용(소문자)
printf("%G\n", 1.2f); // %F와 %E 중에서 짧은 것을 사용(대문자)
printf("%a\n", 1.2f); // 실수를 16진법으로 표기(소문자)
printf("%A\n", 1.2f); // 실수를 16진법으로 표기(대문자)

printf("%Lf", LDBL_MAX); // long double 타입
printf("%Le", LDBL_MAX); // long double 타입

// 문자, 문자열
printf("%c\n", 'a');             // 문자
printf("%s\n", "Hello, world!"); // 문자열

// 포인터
int num1;
void *ptr = &num1;
printf("%p\n", ptr); // 포인터의 메모리 주소
                     // 리눅스, OS X에서는 앞에 0x가 붙고, A~F는 소문자로 출력
                     // 높은 자릿수의 0은 생략

// % 기호
printf("%%\n"); // % 기호 출력


  • 이제 이 기본 서식 지정자에 다양한 플래그, 폭, 정밀도, 길이를 조합해서 사용한다.


%[플래그][][.정밀도][길이]서식지정자


  • 먼저 정수 서식 지정자 %d에 폭을 지정해 보자.
  • 다음과 같이 %d 사이에 숫자를 넣으면 출력 폭을 지정할 수 있다.


printf("%6d\n", 20);   // %d의 출력 폭을 6칸으로 지정
printf("%6d\n", 2000); // %d의 출력 폭을 6칸으로 지정

// ↓ 4칸 공백
//     20
//   2000
// ↑ 2칸 공백


  • 폭을 6칸 지정했으므로 20 앞에는 공백이 4칸, 2000 앞에는 공백이 2칸 채워진다.
  • 즉, 출력할 숫자까지 포함하여 6칸이다.


  • 이번에는 폭과 플래그를 함께 사용해 보자.
  • 다음과 같이 폭 앞에 0을 넣으면 남는 공간에는 공백 대신 0으로 채운다.


printf("%06d\n", 20);   // 출력 폭을 6칸으로 지정, 남는 공간은 0으로 채움
printf("%06d\n", 2000); // 출력 폭을 6칸으로 지정, 남는 공간은 0으로 채움

// ↓ 0이 4개 채워짐
// 000020
// 002000
// ↑ 0이 2개 채워짐


  • 폭을 6칸, 남는 공간을 0으로 채우도록 했으므로 20 앞에는 04개, 2000 앞에는 02개 채워진다.


  • 플래그 부분을 공백으로 지정하면 양수일 때는 부호를 출력하지 않고 공백으로 표시하고, 음수일 때는 - 부호를 출력한다.
  • 그리고 플래그를 +로 지정하면 양수일 때는 + 부호, 음수일 때는 - 부호를 출력한다.


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); // 소수 둘째 자리까지 출력

// 1.20
// 1.20e+00


  • 정밀도를 .2로 지정했으므로 소수 두 번째 자리까지 출력한다.


  • 실수에 플래그, 폭, 정밀도를 함께 지정해 보자.


printf("%010.2f\n", 1.2f); // 출력 폭은 10칸, 소수 둘째 자리까지 출력, 남는 공간은 0으로 채움
printf("%010.2e\n", 1.2f); // 출력 폭은 10칸, 소수 둘째 자리까지 출력, 남는 공간은 0으로 채움

// 0000001.20
// 001.20e+00


  • 출력 폭은 10칸으로 지정하고 소수 두 번째 자리까지 출력에 남는 공간은 0으로 채웠다.
  • 단, 실수는 폭에 소수점과 e+까지 포함한다.


  • 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!

References