Namespaces
Variants

wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s

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

형식 입력
 
헤더 <wchar.h>
int wprintf( const wchar_t* format, ... );
에 정의됨 (1) (C95부터)
(C99까지)
int wprintf( const wchar_t* restrict format, ... );
(C99부터)
int fwprintf( FILE* stream, const wchar_t* format, ... );
(2) (C95부터)
(C99까지)
int fwprintf( FILE* restrict stream,
              const wchar_t* restrict format, ... );
(C99부터)
int swprintf( wchar_t* buffer, size_t bufsz,
              const wchar_t* format, ... );
(3) (C95부터)
(C99까지)
int swprintf( wchar_t* restrict buffer, size_t bufsz,
              const wchar_t* restrict format, ... );
(C99부터)
int wprintf_s( const wchar_t* restrict format, ... );
(4) (C11부터)
int fwprintf_s( FILE* restrict stream,
                const wchar_t* restrict format, ... );
(5) (C11부터)
int swprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
                const wchar_t* restrict format, ... );
(6) (C11부터)
int snwprintf_s( wchar_t* restrict s, rsize_t n,
                 const wchar_t* restrict format, ... );
(7) (C11부터)

주어진 위치에서 데이터를 읽어 와이드 문자열 등가물로 변환하고 결과를 다양한 출력 대상에 씁니다.

1) 결과를 stdout에 씁니다.
2) 결과를 파일 스트림 stream에 씁니다.
3) bufsz이 0보다 크면 결과를 와이드 문자열 buffer에 씁니다. 최대 bufsz - 1개의 와이드 문자를 쓰고 그 뒤에 널 와이드 문자를 붙입니다. bufsz이 0이면 아무것도 쓰지 않습니다(그리고 buffer은 널 포인터일 수 있습니다).
4-6) (1-3)과 동일하지만, 런타임에 다음 오류를 감지하여 현재 설치된 제약 조건 처리기 함수를 호출한다는 점이 다릅니다: 변환 지정자
  • 가 %n에 있음format
  • %s에 해당하는 인수 중 하나가 널 포인터임
  • format 또는 buffer이 널 포인터임
  • bufsz이 0이거나 RSIZE_MAX / sizeof(wchar_t)
  • 보다 큼
  • 문자열 및 문자 변환 지정자에서 인코딩 오류 발생swprintf_s(bufsz에만 해당) 널을 포함하여 쓸 와이드 문자의 수가
을 초과합니다.7) (6)과 동일하지만, s이 가리키는 배열에 맞게 결과를 자릅니다(truncate).
다른 모든 경계 검사 함수와 마찬가지로, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s은 구현이 __STDC_LIB_EXT1__을 정의하고 사용자가 __STDC_WANT_LIB_EXT1__를 정수 상수 1로 정의하여 <stdio.h>를 포함하기 전에 정의한 경우에만 사용할 수 있습니다.

매개변수

stream - 출력할 파일 스트림
buffer - 출력할 와이드 문자 문자열을 가리키는 포인터
bufsz - 최대 bufsz - 1개의 와이드 문자(널 종료자 제외)를 쓸 수 있음
format - 데이터 해석 방법을 지정하는 널 종료 와이드 문자열을 가리키는 포인터
... - 출력할 데이터를 지정하는 인수. 기본 인수 승격 이후의 인수가 해당 변환 지정자가 기대하는 타입이 아니거나, format이 필요로 하는 것보다 인수가 적으면 동작이 정의되지 않습니다. format이 필요로 하는 것보다 인수가 더 있으면 추가 인수는 평가되고 무시됩니다.


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

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

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

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

단일 문자를 씁니다.

  • 인수는 먼저 wchar_tbtowc를 호출한 것처럼 으로 변환됩니다.
  • l 수정자를 사용하면 wint_t 인수가 먼저 wchar_t로 변환됩니다.
해당 없음 해당 없음
int
wint_t
해당 없음 해당 없음 해당 없음 해당 없음 해당 없음
s

문자열을 씁니다.

  • 인수는 초기 이동 상태에서 시작하는 멀티바이트 문자 시퀀스를 포함하는 문자 배열의 첫 번째 요소를 가리키는 포인터여야 하며, 이는 0으로 초기화된 변환 상태로 mbrtowc를 호출한 것처럼 와이드 문자 배열로 변환됩니다.
  • 정밀도는 쓸 최대 와이드 문자 수를 지정합니다. 정밀도가 지정되지 않으면 첫 번째 널 종료자를 포함하지 않고 모든 와이드 문자를 씁니다.
  • l 지정자를 사용하면 인수는 wchar_t 배열의 첫 번째 요소를 가리키는 포인터여야 합니다.
해당 없음 해당 없음
char*
wchar_t*
해당 없음 해당 없음 해당 없음 해당 없음 해당 없음
d
i

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

  • 정밀도는 나타날 최소 자릿수를 지정합니다. 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자를 생성하지 않습니다.
  • z 수정자의 경우 예상 인수 타입은 size_t의 부호 있는 버전입니다.
signed char
short
int
long
long long
intmax_t
※
ptrdiff_t
해당 없음
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의 부호 없는 버전
해당 없음
o

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

  • 정밀도는 나타날 최소 자릿수를 지정합니다. 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자를 생성하지 않습니다.
  • 대체 구현에서는 선행 0을 하나 쓰기 위해 필요하면 정밀도가 증가됩니다. 이 경우 변환된 값과 정밀도가 모두 0이면 단일 0이 쓰입니다.
해당 없음
x
X

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

  • x 변환의 경우 문자 abcdef를 사용합니다.
  • X 변환의 경우 문자 ABCDEF를 사용합니다.
  • 정밀도는 나타날 최소 자릿수를 지정합니다. 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자를 생성하지 않습니다.
  • 대체 구현 0x에서 변환된 값이 0이 아니면 0X이 결과 앞에 붙습니다.
해당 없음
u

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

  • 정밀도는 나타날 최소 자릿수를 지정합니다.
  • 기본 정밀도는 1입니다.
  • 변환된 값과 정밀도가 모두 0이면 변환 결과는 문자를 생성하지 않습니다.
해당 없음
f
F (C99)

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

  • 정밀도는 소수점 문자 뒤에 나타날 정확한 자릿수를 지정합니다.
  • 기본 정밀도는 6입니다.
  • 대체 구현에서는 뒤에 오는 자릿수가 없더라도 소수점 문자가 쓰입니다.
  • 무한대 및 NaN(not-a-number) 변환 스타일에 대해서는 참고를 참조하십시오.
해당 없음 해당 없음
double
double (C99)
해당 없음 해당 없음 해당 없음 해당 없음
long double
e
E

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

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

(C99)

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

  • a 변환 스타일의 경우 [-] 0xh.hhh p±d가 사용됩니다.
  • A 변환 스타일의 경우 [-] 0Xh.hhh P±d가 사용됩니다.
  • 인수가 정규화된 부동 소수점 값이면 첫 번째 16진수 자리는 0이 아닙니다.
  • 값이 0이면 지수도 0입니다.
  • 정밀도는 16진수 점 문자 뒤에 나타날 정확한 자릿수를 지정합니다.
  • 기본 정밀도는 값을 정확히 표현하기에 충분합니다.
  • 대체 구현에서는 뒤에 오는 자릿수가 없더라도 소수점 문자가 쓰입니다.
  • 무한대 및 NaN 변환 스타일에 대해서는 참고를 참조하십시오.
해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음
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

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

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

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

해당 없음 해당 없음
void*
해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음
참고

부동 소수점 변환 함수는 무한대를 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,2) 성공하면 쓴 와이드 문자 수, 오류가 발생하면 음수 값.
3) 성공하면 쓴 와이드 문자 수(종료 널 와이드 문자 제외), 인코딩 오류가 발생하거나 생성될 문자 수가 bufsz보다 크거나 같으면( bufsz이 0일 때 포함) 음수 값.
4,5) 성공하면 쓴 와이드 문자 수, 오류가 발생하면 음수 값.
6) buffer에 쓰인 와이드 문자 수(종료 널 제외). 인코딩 오류 및 오버플로 시 음수 값을 반환합니다. 다른 모든 오류에서는 0을 반환합니다.
7) buffer이 충분히 컸다면 bufsz에 쓰였을 와이드 문자 수(종료 널 제외), 오류가 발생하면 음수 값. (즉, 반환값이 음수가 아니고 bufsz보다 작은 경우에만 쓰기가 성공하고 완료된 것입니다)

참고

좁은 문자열은 필요한 출력 버퍼 크기를 결정할 수 있게 해주는 snprintf를 제공하지만, 와이드 문자열에는 이에 상응하는 함수가 없었습니다 (snwprintf_s까지)(C11부터). 버퍼 크기를 결정하기 위해 프로그램은 swprintf를 호출하고 결과 값을 확인한 후 더 큰 버퍼를 재할당하여 성공할 때까지 다시 시도해야 할 수 있습니다.

snwprintf_s은 swprintf_s과 달리 결과를 buffer이 가리키는 배열에 맞게 자릅니다(truncate). 대부분의 경계 검사 함수는 자르기를 오류로 처리하지만 예외입니다.

예제

#include <locale.h>
#include <wchar.h>

int main(void)
{
    char narrow_str[] = "z\u00df\u6c34\U0001f34c";
                  // or "zß水🍌"
                  // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c";
    wchar_t warr[29]; // the expected string is 28 characters plus 1 null terminator
    setlocale(LC_ALL, "en_US.utf8");
    swprintf(warr, sizeof warr / sizeof* warr,
             L"Converted from UTF-8: '%s'", narrow_str);
    wprintf(L"%ls\n", warr);
}

출력:

Converted from UTF-8: 'zß水🍌'

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.29.2.1 The fwprintf 함수 (p: TBD)
  • 7.29.2.3 The swprintf 함수 (p: TBD)
  • 7.29.2.11 The wprintf 함수 (p: TBD)
  • K.3.9.1.1 The fwprintf_s 함수 (p: TBD)
  • K.3.9.1.4 The swprintf_s 함수 (p: TBD)
  • K.3.9.1.13 The wprintf_s 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.29.2.1 The fwprintf 함수 (p: TBD)
  • 7.29.2.3 The swprintf 함수 (p: TBD)
  • 7.29.2.11 The wprintf 함수 (p: TBD)
  • K.3.9.1.1 The fwprintf_s 함수 (p: TBD)
  • K.3.9.1.4 The swprintf_s 함수 (p: TBD)
  • K.3.9.1.13 The wprintf_s 함수 (p: TBD)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.29.2.1 The fwprintf 함수 (p: 403-410)
  • 7.29.2.3 The swprintf 함수 (p: 416)
  • 7.29.2.11 The wprintf 함수 (p: 421)
  • K.3.9.1.1 The fwprintf_s 함수 (p: 628)
  • K.3.9.1.4 The swprintf_s 함수 (p: 630-631)
  • K.3.9.1.13 The wprintf_s 함수 (p: 637-638)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.24.2.1 The fwprintf 함수 (p: 349-356)
  • 7.24.2.3 The swprintf 함수 (p: 362)
  • 7.24.2.11 The wprintf 함수 (p: 366)

같이 보기

stdout, 파일 스트림 또는 버퍼에 형식화된 출력을 출력합니다.
(함수)
stdout, 파일 스트림
또는 버퍼에 가변 인자 목록을 사용하여 형식화된 와이드 문자 출력을 출력합니다.
(함수)
(C95)
와이드 문자열을 파일 스트림에 씁니다.
(함수)
C++ 문서 for wprintf, fwprintf, swprintf