vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
| 헤더 <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로 지정된 위치에서 데이터를 읽어와 문자 문자열 등가물로 변환하고 결과를 다양한 대상에 씁니다.
stream에 씁니다.buffer에 씁니다.buffer에 씁니다. 최대 bufsz - 1 문자를 씁니다. 결과 문자열은 bufsz이 0이 아닌 경우 널 문자로 종료됩니다. bufsz이 0이면 아무것도 쓰지 않고 buffer는 널 포인터일 수 있지만, 반환값(널 종결자를 제외하고 쓰여졌을 바이트 수)은 여전히 계산되어 반환됩니다.- 변환 지정자
%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
|
단일 문자를 씁니다.
|
N/A | N/A | int |
wint_t |
N/A | N/A | N/A | N/A | N/A |
s
|
문자 문자열을 씁니다.
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
di
|
부호 있는 정수를 십진 표현 [-]dddd로 변환합니다.
|
signed char |
short |
int |
long |
long long |
intmax_t |
※ |
ptrdiff_t |
N/A |
bB (선택 사항)
(C23) |
부호 없는 정수를 이진 표현 bbbb로 변환합니다.
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
ptrdiff_t |
의 부호 없는 버전N/A |
o
|
부호 없는 정수를 8진 표현 oooo로 변환합니다.
|
N/A | ||||||||
xX
|
부호 없는 정수를 16진 표현 hhhh로 변환합니다.
|
N/A | ||||||||
u
|
부호 없는 정수를 십진 표현 dddd로 변환합니다.
|
N/A | ||||||||
fF (C99)
|
부동 소수점 수를 [-]ddd.ddd 스타일의 십진 표기법으로 변환합니다.
|
N/A | N/A | double |
double (C99) |
N/A | N/A | N/A | N/A | long double |
eE
|
부동 소수점 수를 십진 지수 표기법으로 변환합니다.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C99) |
부동 소수점 수를 16진 지수 표기법으로 변환합니다.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
부동 소수점 수를 값과 정밀도에 따라 십진 또는 십진 지수 표기법으로 변환합니다.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
이 함수 호출에서 지금까지 쓴 문자 수를 반환합니다.
|
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 |
| 참고 | ||||||||||
|
부동 소수점 변환 함수는 무한대를 숫자가 아님(NaN)은 변환
고정 너비 문자 타입(int8_t 등)에 대한 올바른 변환 지정자는 <inttypes.h> 헤더에 정의되어 있습니다(단, PRIdMAX, PRIuMAX 등은 메모리 쓰기 변환 지정자 각 변환 지정자의 동작 후에는 시퀀스 포인트가 있습니다. 이를 통해 동일한 변수에 여러 변환 지정이 유효하지 않으면 동작이 정의되지 않습니다. | ||||||||||
반환값
buf_size 제한으로 인해 잘리면, 함수는 제한이 없었다면 쓰여졌을 총 문자 수(종료 널 바이트 제외)를 반환합니다.buffer에 쓴 문자 수(널 문자는 제외하며, buffer이 널 포인터가 아니고 bufsz가 0이 아니며 RSIZE_MAX보다 크지 않은 경우 항상 기록됨). 런타임 제약 조건 위반 시 0, 인코딩 오류 시 음수 값.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 함수
같이 보기
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
가변 인자 목록을 사용하여 stdout, 파일 스트림 또는 버퍼에 형식화된 와이드 문자 출력을 출력합니다 (함수) |
(C99)(C11)(C11)(C11)(C11) |
stdout, 파일 스트림 또는 버퍼에 형식화된 출력을 출력합니다 (함수) |
(C99)(C99)(C99)(C11)(C11)(C11) |
가변 인자 목록을 사용하여 stdin, 파일 스트림 또는 버퍼에서 형식화된 입력을 읽습니다 (함수) (함수) |
C++ 문서 for vprintf, vfprintf, vsprintf, vsnprintf
| |