1. 키워드
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
앞에는 0
이 4
개, 2000
앞에는 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); // 소수 둘째 자리까지 출력
// 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