형식 사양 구문: printfwprintf 함수

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

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

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

각 변환 사양 필드는 특정 형식 옵션 또는 변환 지정자를 의미하는 문자 또는 숫자입니다. 필수 type 필드는 인수에 적용될 변환 종류를 지정합니다. 선택적 플래그, 너비정밀도 필드는 선행 공백 또는 0, 근거 및 표시된 정밀도와 같은 다른 형식 측면을 제어합니다. size 필드는 사용되고 변환되는 인수의 크기를 지정합니다.

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

Important

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

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

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

printf( "%s", user_name );

참고 항목

Visual Studio 2015 printf 에서 함수 및 scanf 제품군이 선언 inline 되고 헤더로 <conio.h> 이동 <stdio.h> 되었습니다. 이전 코드를 마이그레이션하는 경우 이러한 함수와 관련하여 LNK2019 표시될 수 있습니다. 자세한 내용은 Visual C++ 변경 기록 2003 - 2015를 참조하세요.

형식 변환 지정자

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

형식 문자열 뒤에 나오는 인수는 해당 type 문자 및 선택적인 size 접두사에 따라 해석됩니다. 문자 형식 char 에 대한 변환은 wchar_t 사용 또는 사용 c 으로 C지정되며, 사용 중인 서식 함수에 따라 싱글 바이트 및 멀티 바이트 또는 와이드 문자 문자열을 사용 s 하거나 S사용하여 지정합니다. 패밀리 함수 또는 패밀리 함수를 사용하여 지정하고 s 패밀리 함수 wchar_tcharchar* 의해 printf 해석되는 문자 및 wprintfwchar_t* 문자열 인수입니다.c 패밀리 함수 또는 패밀리 함수를 사용하여 지정하고 S 패밀리 함수 charwchar_twchar_t* 의해 printf 해석되는 문자 및 wprintfchar* 문자열 인수입니다.C 이 동작은 Microsoft 전용입니다. 기록상의 이유로 함수는 wprintf 문자를 사용 cs 참조 wchar_t 하고 CS 좁은 문자를 지정합니다.

, , int, longlong long및 해당 unsigned 변형과 같은 short정수 형식은 d, i,uxo, 및 X. 부동 소수점 형식(예: float, doublelong double)은 ,A, e, E, Fgf, 및 G.를 사용하여 a지정됩니다. 기본적으로 크기 접두사로 수정되지 않는 한 정수 인수는 형식으로 int 강제 변환되고 부동 소수점 인수는 강제 변환double됩니다. 64비트 시스템에서 int 는 32비트 값이므로 크기ll 두사를 사용하거나 I64 사용하지 않는 한 출력 형식이 지정되면 64비트 정수가 잘립니다. 지정한 포인터 형식은 p 플랫폼의 기본 포인터 크기를 사용합니다.

참고 항목

Microsoft 전용:
Z 형식 문자 및 함수와 함께 printfwprintf 사용될 때의 , CsS 형식 문자의 동작c은 Microsoft 확장입니다. ISO C 표준은 모든 서식 함수에서 좁은 문자와 문자열, CS 와이드 문자 및 문자열에 대해 일관되게 사용합니다 cs.

형식 필드 문자

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

UCRT(유니버설 C 런타임)
UCRT에는 현재 호환성을 위해 기본 알려진 문제가 있습니다. S 지정자와 Z 마찬가지로 크기 한정자 접두사 없는 지정자는 좁은 인쇄 함수(예: printf)를 사용하는 경우와 ANSI_STRING 와이드 인쇄 함수(예: wprintf)를 사용하는 경우를 나타냅니다UNICODE_STRING.
대신 Z, 를 지정ANSI_STRING하는 데 사용합니다hZ. wZ (또는 lZ) 를 계속 사용하여 .를 지정할 수 있습니다 UNICODE_STRING.

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

Visual Studio 2015 이상 버전에서 부동 소수점 변환 지정자(a, , A, e, Ef, F, gG, )에 해당하는 인수가 무한, 무한 또는 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.#INFrandom-digits
-무한대 -1.#INFrandom-digits
무한(자동 NaN과 같음) digit.#INDrandom-digits
NaN digit.#NANrandom-digits

이러한 문자열은 기호로 접두사로 지정되었을 수 있으며 필드 너비 및 정밀도에 따라 다르게 서식이 지정되었을 수 있으며 경우에 따라 비정상적인 효과가 있을 수 있습니다. 예를 들어 #INF printf("%.2f\n", INFINITY) 두 자릿수로 "반올림"되므로 인쇄 1.#J합니다.

참고 항목

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

참고 항목

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

Important

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

플래그 지시문

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

플래그 문자

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

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

너비 사양

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

너비 지정은 값을 자르지 않습니다. 출력 값의 문자 수가 지정된 너비보다 크거나 width 제공되지 않으면 전체 자릿수 사양에 따라 값의 모든 문자가 출력됩니다.

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

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

변환 사양에서 누락되거나 작은 width 값은 출력 값의 잘림을 일으키지 않습니다. 변환 결과가 값보다 width 넓으면 필드가 확장되어 변환 결과가 포함됩니다.

전체 자릿수 사양

변환 사양에서 세 번째 선택적 필드는 전체 자릿수 사양입니다. 변환 형식에 따라 문자열 문자 수, 소수 자릿수 또는 출력할 유효 자릿수를 지정하는 마침표(.)와 음수가 아닌 소수 정수로 구성됩니다.

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

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

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

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

다음 type 표와 같이 생략할 때 precision 문자는 해석 precision 또는 기본 정밀도를 결정합니다.

전체 자릿수 값이 형식에 미치는 영향

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

인수 크기 사양

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

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

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 또는 I64 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

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

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

hc 형식 hC 지정자는 함수와 Cwprintf 함수의 동의어 cprintf 입니다. A lc, lC, wc또는 wC 형식 지정자는 함수 및 함수 wprintfc 에서와 동의어 Cprintf 입니다. hs 형식 hS 지정자는 함수와 Swprintf 함수의 동의어 sprintf 입니다. , , 또는 형식 지정자는 함수 및 함수 swprintf 의 동의어 printfS 입니다.wSwslSls

참고 항목

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

참고 항목

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