형식 사양 구문: printf 및 wprintf 함수

다양한 printf 함수는 형식 문자열 및 선택적 인수를 사용하고 출력에 대해 형식이 지정된 시퀀스를 생성합니다. 형식 문자열에는 출력용 리터럴 문자이거나 출력에서 인수에 형식을 지정하는 방법을 설명하는 인코드된 변환 사양지시문이 없거나 하나 이상 포함되어 있습니다. 이 항목에서는 형식 문자열에서 변환 사양을 인코드하는 데 사용되는 구문을 설명합니다. 이러한 함수의 목록을 보려면 스트림 I/O를 참조하세요.

다음 양식에서 변환 사양은 선택적 필드 및 필수 필드로 이루어져 있습니다.

%[flags][width][.precision][size]type

각 변환 사양 필드는 특정 형식 옵션 또는 변환 지정자를 의미하는 문자 또는 숫자입니다. 필수 type 필드는 인수에 적용될 변환 종류를 지정합니다. 선택적 flags, widthprecision 필드는 선행 공백 또는 0, 양쪽 맞춤 및 표시되는 전체 자릿수와 같은 추가 형식 요소를 제어합니다. size 필드는 사용되고 변환되는 인수의 크기를 지정합니다.

기본 변환 사양에는 백분율 기호와 형식 문자만 포함됩니다. 예를 들어 %s는 문자열 변환을 지정합니다. 백분율 기호를 인쇄하려면 %%를 사용합니다. 백분율 기호 뒤에 형식 필드로서 의미가 없는 문자가 나오는 경우 잘못된 매개 변수 처리기가 호출됩니다. 자세한 내용은 매개 변수 유효성 검사를 참조하세요.

중요

보안 및 안정성을 위해 변환 사양 문자열이 사용자 정의되어 있지 않은지 확인하세요. 예를 들어 프로그램에서 사용자에게 이름을 입력하라는 메시지를 표시하고 user_name이라는 문자열 변수에 입력을 저장할 수 있습니다. user_name을 인쇄하려면 다음을 수행하지 마세요.

printf( user_name ); /* Danger! If user_name contains "%s", program will crash */

대신 이 작업을 수행하세요.

printf( "%s", user_name );

형식 변환 지정자

type 변환 지정자 문자는 문자, 문자열, 포인터, 정수 또는 부동 소수점 숫자와 같은 해당 인수를 해석하는지 여부를 지정합니다. 형식 문자는 유일하게 요구되는 변환 사양 필드이며 선택적 필드 뒤에 표시됩니다.

형식 문자열 뒤에 나오는 인수는 해당 type 문자 및 선택적인 size 접두사에 따라 해석됩니다. 문자 형식 charwchar_t에 대한 변환은 c 또는 C를 사용하여 지정되고, 싱글바이트/멀티바이트 또는 와이드 문자의 문자열은 사용 중인 형식 지정 함수에 따라 s 또는 S를 사용하여 지정됩니다. cs를 사용하여 지정된 문자 및 문자열 인수는 printf 패밀리 함수에서는 charchar*로 해석되고 wprintf 패밀리 함수에서는 wchar_twchar_t*로 해석됩니다. CS를 사용하여 지정된 문자 및 문자열 인수는 printf 패밀리 함수에서는 wchar_twchar_t*로 해석되고 wprintf 패밀리 함수에서는 charchar*로 해석됩니다. 이 동작은 Microsoft 전용입니다.

short, int, long, long long 등의 정수 형식 및 그 unsigned 변형은 d, i, o, u, xX를 사용하여 지정됩니다. float, double, long double 등의 부동 소수점 형식은 a, A, e, E, f, F, gG를 사용하여 지정됩니다. size 접두사에 의해 수정되지 않는 한, 기본적으로 정수 인수는 int 형식으로 강제 변환되고 부동 소수점 인수는 double로 강제 변환됩니다. 64비트 시스템에서, int는 32비트 값이므로 ll 또는 I64size 접두사가 사용되지 않는 경우 64비트 정수는 출력을 위해 형식이 지정될 때 잘립니다. p로 지정되는 포인터 형식은 플랫폼에 대해 기본 포인터 크기를 사용합니다.

참고

Z 형식 문자와 c, C, sS 형식 문자가 printfwprintf 함수와 함께 사용될 때의 동작은 Microsoft 확장입니다. ISO C 표준에서는 모든 형식 지정 함수에서 반각 문자 및 문자열에 대해 일관되게 cs를 사용하고 와이드 문자 및 문자열에 대해 CS를 사용합니다.

형식 필드 문자

형식 문자 인수 출력 형식
c 문자 printf 함수와 함께 사용될 때 단일 바이트 문자를 지정하고, wprintf 함수와 함께 사용될 때 와이드 문자를 지정합니다.
C 문자 printf 함수와 함께 사용될 때 와이드 문자를 지정하고, wprintf 함수와 함께 사용될 때 단일 바이트 문자를 지정합니다.
d 정수 부호 있는 10진수 정수입니다.
i 정수 부호 있는 10진수 정수입니다.
o 정수 부호 없는 8진수 정수입니다.
u 정수 부호 없는 10진수 정수.
x 정수 부호 없는 16진수 정수이며 "abcdef"를 사용합니다.
X 정수 부호 없는 16진수 정수이며 "ABCDEF"를 사용합니다.
e 부동 소수점 부호 있는 값으로서 형식은 [–]d.dddddd[d]입니다. 여기서 d는 하나의 10진수이고 dddd는 지정된 전체 자릿수에 따라 하나 이상의 10진수이거나 기본적으로 6 자릿수입니다. dd[d]는 출력 형식 및 지수 크기에 따라 두 개 또는 세 개의 10진수입니다.
E 부동 소수점 e가 아니라 E가 지수를 도입한다는 점을 제외하고는 e 형식과 동일합니다.
f 부동 소수점 형식이 [–]dddd.dddd인 부호 있는 값입니다. 여기서 dddd는 하나 이상의 10진수입니다. 소수점 앞의 자릿수는 수의 크기에 따라 다르며, 소수점 뒤의 자릿수는 요청된 전체 자릿수에 따라 다릅니다. 기본 자릿수는 6입니다.
F 부동 소수점 무한대 및 NAN 출력이 대문자로 표시되는 점을 제외하고 f 형식과 동일합니다.
g 부동 소수점 f 또는 e 형식으로 표시되는 부호 있는 값으로서, 두 형식 중 주어진 값 및 전체 자릿수에 대해 더 간단한 형식이 사용됩니다. e 형식은 값의 지수가 –4보다 작거나 precision 인수보다 크거나 같을 때만 사용됩니다. 뒤에 나오는 0은 잘리고, 소수점은 뒤에 하나 이상의 수가 나오는 경우에만 나타납니다.
G 부동 소수점 e가 아니라 E가 지수를 도입(해당하는 경우)한다는 점을 제외하고는 g 형식과 동일합니다.
a 부동 소수점 형식이 [−]0xh.hhhhdd인 부호 있는 16진수 배정밀도 부동 소수점 값입니다. 여기서 h.hhhh는 가수의 16진수(소문자 사용)이며 dd는 지수의 하나 이상의 숫자입니다. 정밀도는 소수점 뒤의 자릿수를 지정합니다.
A 부동 소수점 형식이 [−]0Xh.hhhhdd인 부호 있는 16진수 배정밀도 부동 소수점 값입니다. 여기서 h.hhhh는 가수의 16진수(대문자 사용)이며 dd는 지수의 하나 이상의 숫자입니다. 정밀도는 소수점 뒤의 자릿수를 지정합니다.
n 정수 포인터 지금까지 성공적으로 스트림 또는 버퍼에 쓴 문자의 수입니다. 이 값은 주소가 인수로 지정된 정수에 저장됩니다. 가리키는 대상의 정수 크기는 인수 크기 사양 접두사로 제어할 수 있습니다. n 지정자는 기본적으로 사용되지 않습니다. 자세한 내용은 중요 보안 정보를 참조하세요.
p 포인터 유형 인수를 16진수로 된 주소로 표시합니다.
s 문자열 printf 함수와 함께 사용될 때 단일 바이트 또는 멀티바이트 문자열을 지정하고, wprintf 함수와 함께 사용될 때는 와이드 문자열을 지정합니다. 첫 번째 null 문자 직전까지 또는 precision 값에 도달할 때까지 문자가 표시됩니다.
S 문자열 printf 함수와 함께 사용될 때 와이드 문자열을 지정하고, wprintf 함수와 함께 사용될 때는 단일 바이트 또는 멀티바이트 문자열을 지정합니다. 첫 번째 null 문자 직전까지 또는 precision 값에 도달할 때까지 문자가 표시됩니다.
Z ANSI_STRING 또는 UNICODE_STRING 구조체 ANSI_STRING 또는 UNICODE_STRING 구조체의 주소가 인수로 전달될 때 구조체의 Buffer 필드에서 가리키는 버퍼에 포함되는 문자열을 표시합니다. wsize 한정자 접두사를 사용하여 UNICODE_STRING 인수를 지정합니다(예: %wZ). 구조체의 Length 필드를 문자열의 길이(바이트 단위)로 설정해야 합니다. 구조체의 MaximumLength 필드를 버퍼의 길이(바이트 단위)로 설정해야 합니다.

일반적으로 Z 형식 문자는 dbgPrintkdPrint 등의 변환 사양을 사용하는 드라이버 디버깅 함수에서만 사용됩니다.

Visual Studio 2015부터 부동 소수점 변환 지정자(a, A, e, E, f, F, g, G)에 해당하는 인수가 제한 없음, 무한 또는 NAN인 경우 형식이 지정된 출력은 C99 표준을 따릅니다. 이 표에는 형식이 지정된 출력이 나와 있습니다.

출력
infinity inf
자동 NaN nan
신호 NAN nan(snan)
무한 NAN nan(ind)

이러한 값 앞에 부호가 추가될 수 있습니다. 부동 소수점 type 변환 지정자 문자가 대문자인 경우 출력도 대문자로 형식이 지정됩니다. 예를 들어 형식 지정자가 %f 대신 %F이면 무한대는 inf 대신 INF로 형식이 지정됩니다. 또한 scanf 함수는 이러한 문자열을 구문 분석할 수 있으므로 이러한 값은 printfscanf 함수를 왕복할 수 있습니다.

Visual Studio 2015 이전에는 CRT에서 제한 없음, 무한 및 NAN 값의 출력에 대해 다른 비표준 형식을 사용했습니다.

출력
+ 무한대 1.#INF random-digits
- 무한대 -1.#INF random-digits
무한(자동 NaN과 같음) digit .#IND random-digits
NaN digit .#NAN random-digits

이러한 문자열 앞에 부호가 추가될 수 있고, 때때로 비정상적인 효과와 함께 필드 너비 및 전체 자릿수에 따라 형식이 약간 다르게 지정되었을 수 있습니다. 예를 들어 #INF는 2 자릿수로 "반올림"되기 때문에 printf("%.2f\n", INFINITY)1.#J를 인쇄합니다.

참고

%s 또는 %S에 해당하는 인수나 %Z에 해당하는 인수의 Buffer 필드가 null 포인터인 경우 "(null)"이 표시됩니다.

참고

모든 지수 형식에서 표시할 지수의 최소 자릿수는 2입니다. 필요한 경우에만 3을 사용합니다. _set_output_format 함수를 사용하여, Visual Studio 2013 이하용으로 작성된 코드와의 호환성을 위해 표시되는 자릿수를 3으로 설정할 수 있습니다.

중요

%n 형식은 본질적으로 안전하지 않기 때문에 기본적으로 사용되지 않습니다. 형식 문자열에서 %n이 발견되는 경우 매개 변수 유효성 검사의 설명대로 잘못된 매개 변수 처리기가 호출됩니다. %n 지원을 사용하도록 설정하려면 _set_printf_count_output을 참조하세요.

플래그 지시문

변환 사양의 첫 번째 선택적 필드에는 출력 양쪽 맞춤을 지정하고 기호, 공백, 선행 0, 소수점, 8진수 및 16진수 접두사의 출력을 제어하는 플래그 문자가 0개 이상인 플래그 지시문이 포함됩니다. 하나 이상의 플래그 지시문이 변환 사양에 표시될 수 있으며, 플래그 문자는 어떠한 순서로든 표시될 수 있습니다.

플래그 문자

플래그 의미 기본
- 지정한 필드 너비 내에서 결과를 왼쪽에 맞춰 표시합니다. 오른쪽에 맞춰 표시합니다.
+ 부호 있는 형식에는 기호(+ 또는 –)를 사용하여 출력 값에 접두사를 추가합니다. 부호 있는 음수 값(-)에 대해서만 기호가 표시됩니다.
0 width0이 접두사로 붙은 경우, 최소 너비에 도달할 때까지 선행 0이 추가됩니다. 0-가 둘 다 표시되는 경우 0은 무시됩니다. 0이 정수 형식(i, u, x, X, o, d)에 대해 지정되고 전체 자릿수 사양도 있는 경우(예: %04.d) 0은 무시됩니다. 0a 또는 A 부동 소수점 형식에 대해 지정된 경우, 선행 0은 0x 또는 0X 접두사 뒤의 가수 앞에 붙습니다. 패딩이 없습니다.
blank (' ') 부호 있는 양수 출력 값에는 공백을 접두사로 추가합니다. 공백과 + 플래그가 모두 표시되는 경우 공백은 무시됩니다. 공백이 표시되지 않습니다.
# # 플래그가 o, x 또는 X 형식과 함께 사용되는 경우 이 플래그는 0, 0x 또는 0X를 각각 사용하여 0이 아닌 모든 출력 값에 접두사를 추가합니다. 공백이 표시되지 않습니다.
e, E, f, F, a 또는 A 형식과 함께 사용하는 경우 # 플래그는 출력 값에 소수점을 강제로 포함시킵니다. 소수점 뒤에 숫자가 있는 경우에만 소수점이 표시됩니다.
# 플래그를 g 또는 G 형식과 함께 사용하는 경우 이 플래그는 출력 값이 소수점을 강제로 포함하도록 하고 후행 0이 잘리지 않도록 합니다.

c, d, i, u 또는 s와 함께 사용하는 경우 무시됩니다.
소수점 뒤에 숫자가 있는 경우에만 소수점이 표시됩니다. 후행 0이 잘립니다.

너비 사양

변환 사양에서 선택적인 너비 사양 필드는 flags 문자 뒤에 표시됩니다. width 인수는 출력 문자의 최소 개수를 제어하는 음수가 아닌 10진수 정수입니다. 출력 값의 문자 수가 지정된 너비보다 작은 경우 왼쪽 정렬 플래그(-)가 지정되었는지의 여부에 따라 최소 너비 값에 도달할 때까지 값의 왼쪽 또는 오른쪽에 공백이 추가됩니다. width가 0으로 시작하는 경우 변환이 무한대 또는 NAN인 경우를 제외하고 최소 너비에 도달할 때까지 정수 또는 부동 소수점 변환에 선행 0이 추가됩니다.

너비 지정은 값을 자르지 않습니다. 출력 값의 문자 수가 지정된 너비보다 크거나 width가 지정되지 않은 경우 precision 사양에 따라 값의 모든 문자가 출력됩니다.

너비 지정이 별표(*)인 경우 인수 목록의 int 인수가 값을 제공합니다. 아래 예제와 같이 width 인수는 반드시 인수 목록에서 형식이 지정되는 값 앞에 와야 합니다.

printf("%0*f", 5, 3); /* 00003 is output */

변환 사양에서 width 값이 작거나 누락된 경우 출력 값이 잘리지 않습니다. 변환의 결과가 width 값보다 더 큰 경우 변환 결과를 포함하기 위해 필드가 확장됩니다.

전체 자릿수 사양

변환 사양에서 세 번째 선택적 필드는 전체 자릿수 사양입니다. 이 필드의 내용은 마침표(.) 뒤에 음수가 아닌 10진수 정수가 붙는 형식으로 구성됩니다. 이 정수는 변환 유형에 따라 문자열 문자의 수, 소수점의 수 또는 출력할 유효 자릿수의 수를 지정합니다.

너비 사양과 달리 전체 자릿수 사양을 사용하는 경우에는 출력 값이 잘리거나 부동 소수점 값이 반올림될 수 있습니다. precision을 0으로 지정하는 경우 변환하려는 값이 0이면 아래 예제에 나와 있는 바와 같이 결과에 문자가 출력되지 않습니다.

printf( "%.0d", 0 ); /* No characters output */

전체 자릿수 사양이 별표(*)인 경우 인수 목록의 int 인수가 값을 제공합니다. 인수 목록에서 precision 인수는 아래 예제에 나와 있는 것처럼 형식이 지정되는 값 앞에 와야 합니다.

printf( "%.*f", 3, 3.14159265 ); /* 3.142 output */

다음 표에 표시된 것처럼 type 문자에 따라 precision 또는 기본 전체 자릿수(precision을 생략하는 경우)의 해석이 결정됩니다.

전체 자릿수 값이 형식에 영향을 주는 방식

형식 의미 기본
a, A 정밀도는 소수점 뒤의 자릿수를 지정합니다. 기본 전체 자릿수는 13입니다. 전체 자릿수가 0인 경우 # 플래그를 사용하지 않으면 소수점이 인쇄되지 않습니다.
c, C 전체 자릿수가 적용되지 않습니다. 문자가 출력됩니다.
d, i, o, u, x, X 전체 자릿수가 인쇄할 최소 자릿수를 지정합니다. 인수의 자릿수가 precision 미만이면 출력 값 왼쪽에 0이 채워집니다. 자릿수가 precision을 초과해도 값은 잘리지 않습니다. 기본 전체 자릿수는 1입니다.
e, E 전체 자릿수가 소수점 뒤에 인쇄할 자릿수를 지정합니다. 마지막으로 인쇄되는 숫자는 반올림됩니다. 기본 전체 자릿수는 6입니다. precision이 0이거나 마침표(.)가 표시되고 그 뒤에 숫자가 없으면 소수점은 인쇄되지 않습니다.
f, F 전체 자릿수 값이 소수점 뒤의 자릿수를 지정합니다. 소수점이 표시되는 경우에는 소수점 앞에 숫자가 하나 이상 표시됩니다. 값은 적절한 자릿수로 반올림됩니다. 기본 전체 자릿수는 6입니다. precision이 0이거나 마침표(.)가 표시되고 그 뒤에 숫자가 없으면 소수점은 인쇄되지 않습니다.
g, G 전체 자릿수가 인쇄되는 유효 자릿수의 최대 수를 지정합니다. 유효 자릿수 6개가 인쇄되며 후행 0은 잘립니다.
s, S 전체 자릿수가 인쇄할 최대 문자 수를 지정합니다. precision을 초과하는 문자는 인쇄되지 않습니다. null 문자가 나타날 때까지 문자가 인쇄됩니다.

인수 크기 사양

변환 사양에서 크기 필드는 형식 변환 지정자에 대한 인수 길이 한정자입니다. type 필드에 대한 size 필드 접두사(hh, h, j, l(소문자 L), L, ll, t, w, z, I(대문자 i), I32I64)는 수정하는 변환 지정자에 따라 해당 인수의 "크기"(길거나 짧음, 32비트 또는 64비트, 싱글바이트 문자 또는 와이드 문자)를 지정합니다. 다음 표에 표시된 것처럼 이러한 크기 접두사는 printfwprintf 함수 패밀리에 type 문자와 함께 사용되어 인수 크기 해석을 지정합니다. 일부 인수 형식의 경우 size 필드는 선택 사항입니다. 크기 접두사가 지정되지 않으면 포맷터가 정수 인수(예: 부호 있는 또는 부호 없는 char, short, int, long 및 열거형 형식)를 32비트 int 형식으로 사용하고 float, doublelong double 부동 소수점 인수를 64비트 double 형식으로 사용합니다. 가변 인수 목록의 기본 인수 승격 규칙과 일치합니다. 인수 승격에 대한 자세한 내용은 후위 식의 줄임표 및 기본 인수를 참조하세요. 32비트 및 64비트 시스템 모두에서 ll 또는 I64 크기 접두사가 64비트 정수 인수의 변환 사양에 포함되어야 합니다. 그렇지 않으면 포맷터 동작이 정의되지 않습니다.

일부 형식은 32비트 및 64비트 코드에서 크기가 다릅니다. 예를 들어 size_t는 x86용으로 컴파일된 코드에서는 32비트 길이이며 x64용으로 컴파일된 코드에서는 64비트입니다. 가변 너비 형식에 대해 플랫폼 제약 없는 형식 지정 코드를 만들려면 가변 너비 인수 크기 한정자를 사용할 수 있습니다. 또는 64비트 인수 크기 한정자를 사용하여 명시적으로 가변 너비 인수 형식을 64비트로 승격합니다. Microsoft 전용 I(대문자 i) 인수 크기 한정자는 가변 너비 정수 인수를 처리하지만, 이식성을 위해 형식별 j, tz 한정자를 사용하는 것이 좋습니다.

Printf 및 wprintf 서식 형식 지정자에 대한 크기 접두사

지정할 함수 접두사 사용 형식 지정자 사용
char
unsigned char
hh d, i, o, u, x 또는 X
short int
short unsigned int
h d, i, o, u, x 또는 X
__int32
unsigned __int32
I32 d, i, o, u, x 또는 X
__int64
unsigned __int64
I64 d, i, o, u, x 또는 X
intmax_t
uintmax_t
j 또는 I(대문자 i) d, i, o, u, x 또는 X
long double l(소문자 L) 또는 L a, A, e, E, f, F, g 또는 G
long int
long unsigned int
l(소문자 L) d, i, o, u, x 또는 X
long long int
unsigned long long int
ll(소문자 LL) d, i, o, u, x 또는 X
ptrdiff_t t 또는 I(대문자 i) d, i, o, u, x 또는 X
size_t z 또는 I(대문자 i) d, i, o, u, x 또는 X
싱글바이트 문자 h c 또는 C
와이드 문자 l(소문자 L) 또는 w c 또는 C
싱글바이트 문자열 h s, S 또는 Z
와이드 문자열 l(소문자 L) 또는 w s, S 또는 Z

intmax_t, uintmax_t, ptrdiff_tsize_t 형식은 32비트 플랫폼에서는 __int32 또는 unsigned __int32이며 64비트 플랫폼에서는 __int64 또는 unsigned __int64입니다. I(대문자 i), j, tz 크기 접두사는 플랫폼에 대해 올바른 인수를 사용합니다.

Visual C++에서 long double은 고유한 형식이지만 내부 표현은 double과 동일합니다.

hc 또는 hC 형식 지정자는 printf 함수의 cwprintf 함수의 C와 같습니다. lc, lC, wc 또는 wC 형식 지정자는 printf 함수의 Cwprintf 함수의 c와 같습니다. hs 또는 hS 형식 지정자는 printf 함수의 swprintf 함수의 S와 같습니다. ls, lS, ws 또는 wS 형식 지정자는 printf 함수의 Swprintf 함수의 s와 같습니다.

참고

I(대문자 i), I32, I64w 인수 크기 한정자 접두사는 Microsoft 확장이며 ISO C와 호환되지 않습니다. char 형식의 데이터와 함께 사용되는 h 접두사 및 double 형식의 데이터와 함께 사용되는 l 접두사는 Microsoft 확장입니다.

참고 항목

printf, _printf_l, wprintf, _wprintf_l
printf_s, _printf_s_l, wprintf_s, _wprintf_s_l
printf_p 위치 매개 변수