Namespaces
Variants

vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s

cppreference.net에서
< c | io
 
 
파일 입출력
타입과 객체
        
함수
파일 접근
(C95)
형식 없는 입출력
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

형식 있는 입력
 
헤더 <stdio.h>
int vprintf( const char* format, va_list vlist );
에 정의됨 (1) (C99까지)
int vprintf( const char* restrict format, va_list vlist );
(C99부터)
int vfprintf( FILE* stream, const char* format, va_list vlist );
(2) (C99까지)
int vfprintf( FILE* restrict stream, const char* restrict format,
              va_list vlist );
(C99부터)
int vsprintf( char* buffer, const char* format, va_list vlist );
(3) (C99까지)
int vsprintf( char* restrict buffer, const char* restrict format,
              va_list vlist );
(C99부터)
int vsnprintf( char* restrict buffer, size_t bufsz,
               const char* restrict format, va_list vlist );
(4) (C99부터)
int vprintf_s( const char* restrict format, va_list vlist );
(5) (C11부터)
int vfprintf_s( FILE* restrict stream, const char* restrict format,
                va_list vlist );
(6) (C11부터)
int vsprintf_s( char* restrict buffer, rsize_t bufsz,
                const char* restrict format, va_list vlist );
(7) (C11부터)
int vsnprintf_s( char* restrict buffer, rsize_t bufsz,
                 const char* restrict format, va_list vlist );
(8) (C11부터)

vlist로 지정된 위치에서 데이터를 읽어와 문자 문자열 등가물로 변환하고 결과를 다양한 대상에 씁니다.

1) 결과를 stdout에 씁니다.
2) 결과를 파일 스트림 stream에 씁니다.
3) 결과를 문자 문자열 buffer에 씁니다.
4) 결과를 문자 문자열 buffer에 씁니다. 최대 bufsz - 1 문자를 씁니다. 결과 문자열은 bufsz이 0이 아닌 경우 널 문자로 종료됩니다. bufsz이 0이면 아무것도 쓰지 않고 buffer는 널 포인터일 수 있지만, 반환값(널 종결자를 제외하고 쓰여졌을 바이트 수)은 여전히 계산되어 반환됩니다.
5-8) (1-4)와 동일하지만, 다음 오류들이 런타임에 감지되고 현재 설치된 제약 조건 처리기 함수를 호출합니다:
  • 변환 지정자 %n이 format
  • 에 있음%s에 해당하는 인수 중 하나가 널 포인터임
  • format 또는 buffer이 널 포인터임
  • bufsz이 0이거나 RSIZE_MAX
  • 보다 큼문자열 및 문자 변환 지정자에서 인코딩 오류 발생
  • (vsprintf_s에만 해당), buffer에 저장될 문자열(끝 널 문자 포함)이 bufsz
을 초과함 모든 경계 검사 함수와 마찬가지로, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s은 구현이 __STDC_LIB_EXT1__를 정의하고 사용자가 __STDC_WANT_LIB_EXT1__를 정수 상수 1로 정의한 후 <stdio.h>를 포함하는 경우에만 사용이 보장됩니다.

매개변수

stream - 출력 대상 파일 스트림
buffer - 출력 대상 문자 문자열을 가리키는 포인터
bufsz - 최대 bufsz - 1 문자를 쓸 수 있으며, 널 종결자는 별도
format - 데이터 해석 방법을 지정하는 널 종료 문자 문자열을 가리키는 포인터
vlist - 출력할 데이터를 포함하는 가변 인자 목록.

format 문자열은 %를 제외한 일반 바이트 문자(변경 없이 출력 스트림에 복사됨)와 변환 지정자로 구성됩니다. 각 변환 지정자는 다음과 같은 형식을 가집니다:

  • 소개 % 문자.
  • (선택 사항) 변환 동작을 수정하는 하나 이상의 플래그:
  • -: 변환 결과가 필드 내에서 왼쪽 정렬됩니다(기본값은 오른쪽 정렬).
  • +: 부호 있는 변환의 부호가 항상 변환 결과 앞에 붙습니다(기본값은 음수일 때만 마이너스가 앞에 붙음).
  • 공백: 부호 있는 변환 결과가 부호 문자로 시작하지 않거나 비어 있으면 결과 앞에 공백이 붙습니다. + 플래그가 있으면 무시됩니다.
  • #: 변환의 대체 형식이 수행됩니다. 정확한 효과는 아래 표를 참조하십시오. 그렇지 않으면 동작이 정의되지 않습니다.
  • 0: 정수 및 부동 소수점 변환에서 공백 문자 대신 선행 0으로 필드를 채웁니다. 정수 숫자의 경우 정밀도가 명시적으로 지정되면 무시됩니다. 다른 변환에서 이 플래그를 사용하면 정의되지 않은 동작이 발생합니다. - 플래그가 있으면 무시됩니다.
  • (선택 사항) 최소 필드 너비를 지정하는 정수 값 또는 *. 결과는 필요에 따라 공백 문자로 채워집니다(기본값). 오른쪽 정렬 시 왼쪽에, 왼쪽 정렬 시 오른쪽에 채워집니다. *를 사용하는 경우 너비는 int 유형의 추가 인수로 지정되며, 이 인수는 변환할 인수와 정밀도를 제공하는 인수(제공된 경우) 앞에 나타납니다. 인수 값이 음수이면 - 플래그가 지정되고 양수 필드 너비가 적용됩니다(참고: 이는 최소 너비이며 값이 잘리지 않습니다.).
  • (선택 사항) . 뒤에 정수 또는 *이 오거나 아무것도 오지 않으며 변환의 정밀도를 지정합니다. *를 사용하는 경우 정밀도는 int 유형의 추가 인수로 지정되며, 이 인수는 변환할 인수 앞에 나타나지만 최소 필드 너비를 제공하는 인수(제공된 경우) 뒤에 나타납니다. 이 인수 값이 음수이면 무시됩니다. 숫자도 *도 사용되지 않으면 정밀도는 0으로 간주됩니다. 정밀도의 정확한 효과는 아래 표를 참조하십시오.
  • (선택 사항) 길이 수정자: 인수의 크기를 지정합니다(변환 형식 지정자와 함께 해당 인수의 타입을 지정합니다).
  • 변환 형식 지정자.

사용 가능한 형식 지정자는 다음과 같습니다:

변환
지정자
설명 예상
인수 타입
길이 수정자→ hh h 없음 l ll j z t L
C99부터만 가능→ 예 예 예 예 예
% 리터럴 %을 씁니다. 전체 변환 지정자는 %%여야 합니다. N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

단일 문자를 씁니다.

  • 인수는 먼저 unsigned char로 변환됩니다.
  • l 수정자가 사용되면, 인수는 먼저 %ls에 wchar_t[2] 인수를 사용한 것처럼 문자 문자열로 변환됩니다.
N/A N/A
int
wint_t
N/A N/A N/A N/A N/A
s

문자 문자열을 씁니다.

  • 인수는 문자 배열의 첫 번째 요소를 가리키는 포인터여야 합니다.
  • 정밀도는 쓸 최대 바이트 수를 지정합니다. 정밀도가 지정되지 않으면 첫 번째 널 종결자를 포함하지 않고 모든 바이트를 씁니다.
  • l 지정자가 사용되면 인수는 wchar_t 배열의 첫 번째 요소를 가리키는 포인터여야 하며, 0으로 초기화된 변환 상태로 wcrtomb을 호출한 것처럼 char 배열로 변환됩니다.
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
d
i

부호 있는 정수를 십진 표현 [-]dddd로 변환합니다.

  • 정밀도는 표시될 최소 자릿수를 지정합니다. 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자가 없습니다.
  • z 수정자의 경우 예상 인수 타입은 size_t의 부호 있는 버전입니다.
signed char
short
int
long
long long
intmax_t
※
ptrdiff_t
N/A
b
B (선택 사항)

(C23)

부호 없는 정수를 이진 표현 bbbb로 변환합니다.

  • 정밀도는 표시될 최소 자릿수를 지정합니다. 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자가 없습니다.
  • 대체 구현 0b에서 변환된 값이 0이 아니면 0B이 결과 앞에 붙습니다.
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
ptrdiff_t
의 부호 없는 버전N/A
o

부호 없는 정수를 8진 표현 oooo로 변환합니다.

  • 정밀도는 표시될 최소 자릿수를 지정합니다. 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자가 없습니다.
  • 대체 구현에서 필요한 경우 선행 0을 하나 쓰도록 정밀도가 증가합니다. 이 경우 변환된 값과 정밀도가 모두 0이면 단일 0이 기록됩니다.
N/A
x
X

부호 없는 정수를 16진 표현 hhhh로 변환합니다.

  • x 변환의 경우 문자 abcdef가 사용됩니다.
  • X 변환의 경우 문자 ABCDEF가 사용됩니다.
  • 정밀도는 표시될 최소 자릿수를 지정합니다. 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자가 없습니다.
  • 대체 구현 0x에서 변환된 값이 0이 아니면 0X이 결과 앞에 붙습니다.
N/A
u

부호 없는 정수를 십진 표현 dddd로 변환합니다.

  • 정밀도는 표시될 최소 자릿수를 지정합니다.
  • 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자가 없습니다.
N/A
f
F (C99)

부동 소수점 수를 [-]ddd.ddd 스타일의 십진 표기법으로 변환합니다.

  • 정밀도는 소수점 문자 뒤에 표시될 정확한 자릿수를 지정합니다.
  • 기본 정밀도는 6입니다.
  • 대체 구현에서는 뒤에 오는 숫자가 없어도 소수점 문자가 기록됩니다.
  • 무한대 및 숫자가 아님(NaN) 변환 스타일에 대해서는 참고를 참조하십시오.
N/A N/A
double
double (C99)
N/A N/A N/A N/A
long double
e
E

부동 소수점 수를 십진 지수 표기법으로 변환합니다.

  • e 변환 스타일의 경우 [-]d.ddd e±dd가 사용됩니다.
  • E 변환 스타일의 경우 [-]d.ddd E±dd가 사용됩니다.
  • 지수는 최소 두 자리 이상이며, 필요한 경우에만 더 많은 자릿수가 사용됩니다.
  • 값이 0이면 지수도 0입니다.
  • 정밀도는 소수점 문자 뒤에 표시될 정확한 자릿수를 지정합니다.
  • 기본 정밀도는 6입니다.
  • 대체 구현에서는 뒤에 오는 숫자가 없어도 소수점 문자가 기록됩니다.
  • 무한대 및 숫자가 아님(NaN) 변환 스타일에 대해서는 참고를 참조하십시오.
N/A N/A N/A N/A N/A N/A
a
A

(C99)

부동 소수점 수를 16진 지수 표기법으로 변환합니다.

  • a 변환 스타일의 경우 [-] 0xh.hhh p±d가 사용됩니다.
  • A 변환 스타일의 경우 [-] 0Xh.hhh P±d가 사용됩니다.
  • 인수가 정규화된 부동 소수점 값이면 첫 번째 16진 숫자는 0이 아닙니다.
  • 값이 0이면 지수도 0입니다.
  • 정밀도는 16진 소수점 문자 뒤에 표시될 정확한 자릿수를 지정합니다.
  • 기본 정밀도는 값을 정확하게 표현하기에 충분합니다.
  • 대체 구현에서는 뒤에 오는 숫자가 없어도 소수점 문자가 기록됩니다.
  • 무한대 및 숫자가 아님(NaN) 변환 스타일에 대해서는 참고를 참조하십시오.
N/A N/A N/A N/A N/A N/A
g
G

부동 소수점 수를 값과 정밀도에 따라 십진 또는 십진 지수 표기법으로 변환합니다.

  • g 변환 스타일의 경우 e 또는 f 스타일로 변환이 수행됩니다.
  • G 변환 스타일의 경우 E 또는 f(C99까지)F(C99부터) 스타일로 변환이 수행됩니다.
  • P을 정밀도가 0이 아니면 정밀도와 같게, 정밀도가 지정되지 않았으면 6와 같게, 정밀도가 1이면 0와 같게 둡니다. 그런 다음, E 스타일의 변환이 지수 X를 가진다면:
    • P > X ≥ −4인 경우, 변환은 f 또는 F(C99부터) 스타일로 수행되며 정밀도는 P − 1 − X입니다.
    • 그렇지 않으면 변환은 e 또는 E 스타일로 수행되며 정밀도는 P − 1입니다.
  • 대체 표현이 요청되지 않으면 후행 0이 제거되며, 소수 부분이 남지 않으면 소수점 문자도 제거됩니다.
  • 무한대 및 숫자가 아님(NaN) 변환 스타일에 대해서는 참고를 참조하십시오.
N/A N/A N/A N/A N/A N/A
n

이 함수 호출에서 지금까지 쓴 문자 수를 반환합니다.

  • 결과는 인수가 가리키는 값에 쓰여집니다.
  • 지정자는 플래그, 필드 너비 또는 정밀도를 포함할 수 없습니다.
  • z 수정자의 경우 예상 인수 타입은 S*이며, 여기서 S는 size_t의 부호 있는 버전입니다.
signed char*
short*
int*
long*
long long*
intmax_t*
※
 ptrdiff_t* 
N/A
p

포인터를 정의하는 구현 정의 문자 시퀀스를 씁니다.

N/A N/A
void*
N/A N/A N/A N/A N/A N/A
참고

부동 소수점 변환 함수는 무한대를 inf 또는 infinity로 변환합니다. 어느 것을 사용할지는 구현에서 정의합니다.

숫자가 아님(NaN)은 nan 또는 nan(char_sequence)로 변환됩니다. 어느 것을 사용할지는 구현에서 정의합니다.

변환 F, E, G, A은 대신 INF, INFINITY, NAN을 출력합니다.

char, unsigned char, signed char, short, unsigned short을 출력하는 데 사용되는 변환 지정자는 기본 인수 승격의 승격된 타입을 예상하지만, 출력 전에 그 값은 char, unsigned char, signed char, short, unsigned short으로 변환됩니다. 가변 인자 함수가 호출될 때 승격이 발생하므로 이러한 타입의 값을 전달하는 것은 안전합니다.

고정 너비 문자 타입(int8_t 등)에 대한 올바른 변환 지정자는 <inttypes.h> 헤더에 정의되어 있습니다(단, PRIdMAX, PRIuMAX 등은 %jd, %ju 등과 동의어입니다).

메모리 쓰기 변환 지정자 %n은 형식 문자열이 사용자 입력에 의존하는 보안 취약점의 일반적인 대상이며, 경계 검사가 적용되는 printf_s 함수 계열(C11부터)에서는 지원되지 않습니다.

각 변환 지정자의 동작 후에는 시퀀스 포인트가 있습니다. 이를 통해 동일한 변수에 여러 %n 결과를 저장하거나, 극단적인 경우 동일한 호출 내에서 이전 %n에 의해 수정된 문자열을 출력할 수 있습니다.

변환 지정이 유효하지 않으면 동작이 정의되지 않습니다.

반환값

1-3) 성공하면 쓴 문자 수, 오류가 발생하면 음수 값.
4) 성공하면 쓴 문자 수, 오류가 발생하면 음수 값. 결과 문자열이 buf_size 제한으로 인해 잘리면, 함수는 제한이 없었다면 쓰여졌을 총 문자 수(종료 널 바이트 제외)를 반환합니다.
5,6) 출력 스트림으로 전송된 문자 수, 또는 출력 오류, 런타임 제약 조건 위반 오류, 또는 인코딩 오류가 발생하면 음수 값.
7)buffer에 쓴 문자 수(널 문자는 제외하며, buffer이 널 포인터가 아니고 bufsz가 0이 아니며 RSIZE_MAX보다 크지 않은 경우 항상 기록됨). 런타임 제약 조건 위반 시 0, 인코딩 오류 시 음수 값.
8) 종료 널 문자를 제외한 문자 수(널 문자는 buffer이 널 포인터가 아니고 bufsz가 0이 아니며 RSIZE_MAX보다 크지 않은 경우 항상 기록됨). buffer에 쓰여졌을 문자 수(bufsz가 무시된 경우), 또는 런타임 제약 조건 위반 또는 인코딩 오류가 발생하면 음수 값.

참고

이 함수들은 모두 va_arg을 최소 한 번 호출하며, 반환 후 arg의 값은 불확정입니다. 이 함수들은 va_end을 호출하지 않으므로 호출자가 호출해야 합니다.

vsnprintf_s, vsprintf_s과 달리, buffer가 가리키는 배열에 맞게 결과를 자릅니다.

vsnprintf_s의 구현 중 Microsoft CRT는 C 표준을 준수하지 않습니다. Microsoft 버전에는 세 번째 위치에 널 종결자를 포함하지 않고 쓸 최대 문자 수를 포함하는 추가 매개변수 size_t count가 있습니다. 이 매개변수는 size_t bufsz 매개변수를 통해 제공된 버퍼 크기와 다를 수 있습니다.

예제

#include <stdarg.h>
#include <stdio.h>
#include <time.h>

void debug_log(const char* fmt, ...)
{
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    char time_buf[100];
    size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec));
    snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000);

    va_list args1;
    va_start(args1, fmt);
    va_list args2;
    va_copy(args2, args1);
    char buf[1+vsnprintf(NULL, 0, fmt, args1)];
    va_end(args1);
    vsnprintf(buf, sizeof buf, fmt, args2);
    va_end(args2);

    printf("%s [debug]: %s\n", time_buf, buf);
}

int main(void)
{
    debug_log("Logging, %d, %d, %d", 1, 2, 3);
}

가능한 출력:

02/20/15 21:58:09.072683 UTC [debug]: Logging, 1, 2, 3

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.21.6.8 The vfprintf 함수 (p: TBD)
  • 7.21.6.10 The vprintf 함수 (p: TBD)
  • 7.21.6.12 The vsnprintf 함수 (p: TBD)
  • 7.21.6.13 The vsprintf 함수 (p: TBD)
  • K.3.5.3.8 The vfprintf_s 함수 (p: TBD)
  • K.3.5.3.10 The vprintf_s 함수 (p: TBD)
  • K.3.5.3.12 The vsnprintf_s 함수 (p: TBD)
  • K.3.5.3.13 The vsprintf_s 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.21.6.8 The vfprintf 함수 (p: 238)
  • 7.21.6.10 The vprintf 함수 (p: 239)
  • 7.21.6.12 The vsnprintf 함수 (p: 239-240)
  • 7.21.6.13 The vsprintf 함수 (p: 240)
  • K.3.5.3.8 The vfprintf_s 함수 (p: 434)
  • K.3.5.3.10 The vprintf_s 함수 (p: 435)
  • K.3.5.3.12 The vsnprintf_s 함수 (p: 436-437)
  • K.3.5.3.13 The vsprintf_s 함수 (p: 437)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.21.6.8 The vfprintf 함수 (p: 326-327)
  • 7.21.6.10 The vprintf 함수 (p: 328)
  • 7.21.6.12 The vsnprintf 함수 (p: 329)
  • 7.21.6.13 The vsprintf 함수 (p: 329)
  • K.3.5.3.8 The vfprintf_s 함수 (p: 597)
  • K.3.5.3.10 The vprintf_s 함수 (p: 598-599)
  • K.3.5.3.12 The vsnprintf_s 함수 (p: 600)
  • K.3.5.3.13 The vsprintf_s 함수 (p: 601)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.19.6.8 The vfprintf 함수 (p: 292)
  • 7.19.6.10 The vprintf 함수 (p: 293)
  • 7.19.6.12 The vsnprintf 함수 (p: 294)
  • 7.19.6.13 The vsprintf 함수 (p: 295)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.9.6.7 The vfprintf 함수
  • 4.9.6.8 The vprintf 함수
  • 4.9.6.9 The vsprintf 함수

같이 보기

가변 인자 목록을 사용하여 stdout, 파일 스트림
또는 버퍼에 형식화된 와이드 문자 출력을 출력합니다
(함수)
stdout, 파일 스트림 또는 버퍼에 형식화된 출력을 출력합니다
(함수)
가변 인자 목록을 사용하여 stdin, 파일 스트림 또는 버퍼에서 형식화된 입력을 읽습니다
(함수)
(함수)
C++ 문서 for vprintf, vfprintf, vsprintf, vsnprintf