Namespaces
Variants

std:: printf, std:: fprintf, std:: sprintf, std:: snprintf

From cppreference.net
< cpp ‎ | io ‎ | c
헤더 파일에 정의됨 <cstdio>
int printf ( const char * format, ... ) ;
(1)
int fprintf ( std:: FILE * stream, const char * format, ... ) ;
(2)
int sprintf ( char * buffer, const char * format, ... ) ;
(3)
int snprintf ( char * buffer, std:: size_t buf_size, const char * format, ... ) ;
(4) (C++11부터)

주어진 위치에서 데이터를 로드하고, 이를 문자 문자열 등가물로 변환한 후 다양한 싱크에 결과를 기록합니다.

1) 결과를 stdout 에 기록합니다.
2) 결과를 파일 스트림 stream 에 기록합니다.
3) 결과를 문자 문자열 buffer 에 기록합니다.
4) 결과를 문자 문자열 buffer 에 기록합니다. 최대 buf_size - 1 개의 문자가 기록됩니다. 결과 문자열은 buf_size 가 0이 아닌 경우 null 문자로 종료됩니다. 만약 buf_size 가 0이면 아무것도 기록되지 않으며 buffer 는 null 포인터일 수 있지만, 반환값(null 종결자를 제외한 기록될 바이트 수)은 여전히 계산되어 반환됩니다.

sprintf 또는 snprintf 호출이 겹치는 객체 간에 복사가 발생하도록 하는 경우, 동작은 정의되지 않습니다 (예: sprintf ( buf, "%s text" , buf ) ; ).

목차

매개변수

stream - 출력할 파일 스트림
buffer - 출력할 문자열 버퍼 포인터
buf_size - 최대 buf_size - 1 개의 문자와 널 종결자를 기록할 수 있음
format - 데이터 해석 방법을 지정하는 널 종결 다중 바이트 문자열 포인터
... - 출력할 데이터를 지정하는 인자들. 기본 인자 승격 이후의 인자가 해당 변환 지정자에 기대되는 타입(기대 타입은 승격된 타입이거나 승격된 타입과 호환되는 타입)이 아니거나, format 이 요구하는 것보다 인자가 적으면 동작은 정의되지 않음. format 이 요구하는 것보다 인자가 많으면 초과 인자는 평가된 후 무시됨

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

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

다음 형식 지정자를 사용할 수 있습니다:

변환
지정자
설명 예상
인수 유형
길이 수정자→ hh h 없음 l ll j z t L
C++11부터만 사용 가능→ Yes Yes Yes Yes Yes
% 리터럴 % 를 출력합니다. 전체 변환 지정자는 %% 이어야 합니다. 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
std::wint_t
N/A N/A N/A N/A N/A
s

문자열 을 기록합니다.

  • 인자는 문자 배열의 첫 번째 요소를 가리키는 포인터여야 합니다.
  • Precision 은 기록할 최대 바이트 수를 지정합니다. Precision 이 지정되지 않은 경우, 첫 번째 널 종결자(null terminator)까지의 모든 바이트를 기록합니다.
  • l 지정자가 사용된 경우, 인자는 wchar_t 배열의 첫 번째 요소를 가리키는 포인터여야 하며, 이는 std::wcrtomb 호출을 통해 0으로 초기화된 변환 상태로 char 배열로 변환됩니다.
N/A N/A
char *
wchar_t *
N/A N/A N/A N/A N/A
d
i

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

  • 정밀도 는 표시될 최소 자릿수를 지정합니다. 기본 정밀도는 1 입니다.
  • 변환된 값과 정밀도가 모두 0 인 경우 변환 결과로 아무 문자도 생성되지 않습니다.
  • z 수식자의 경우 예상 인수 타입은 std::size_t 의 부호 있는 버전입니다.
signed char
short
int
long
long long
N/A
o

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

  • 정밀도 는 표시될 최소 자릿수를 지정합니다. 기본 정밀도는 1 입니다.
  • 변환된 값과 정밀도가 모두 0 인 경우 변환 결과로 문자가 생성되지 않습니다.
  • 대체 구현 에서는 선행 0 하나를 쓰기 위해 필요한 경우 정밀도가 증가됩니다. 이 경우 변환된 값과 정밀도가 모두 0 이면 단일 0 이 기록됩니다.
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
std::ptrdiff_t 의 부호 없는 버전
해당 없음
x
X

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

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

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

  • 정밀도 는 표시될 최소 자릿수를 지정합니다.
  • 기본 정밀도는 1 입니다.
  • 변환된 값과 정밀도가 모두 0 인 경우, 변환 결과로 문자가 생성되지 않습니다.
N/A
f
F (C++11)

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

  • 정밀도 는 소수점 문자 뒤에 나타날 정확한 자릿수를 지정합니다.
  • 기본 정밀도는 6 입니다.
  • 대체 구현 에서는 숫자가 뒤따르지 않더라도 소수점 문자가 기록됩니다.
  • 무한대 및 NaN 변환 스타일에 대해서는 참고 사항 을 참조하십시오.
해당 없음 해당 없음
double
double (C++11)
해당 없음 해당 없음 해당 없음 해당 없음
long double
e
E

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

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

(C++11)

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

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

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

  • g 변환 스타일의 경우 e 또는 f 스타일로 변환이 수행됩니다.
  • G 변환 스타일의 경우 E 또는 f (C++11 이전) F (C++11 이후) 스타일로 변환이 수행됩니다.
  • P 를 정밀도가 0이 아닐 경우 정밀도 값, 지정되지 않았을 경우 6 , 정밀도가 0 일 경우 1 으로 설정합니다. 그러면 E 스타일 변환의 지수가 X 일 때:
    • P > X ≥ −4 인 경우, 변환은 f 또는 F (C++11 이후) 스타일로 수행되며 정밀도는 P − 1 − X 입니다.
    • 그렇지 않으면 변환은 e 또는 E 스타일로 수행되며 정밀도는 P − 1 입니다.
  • 대체 표현 이 요청되지 않는 한 후행 영점은 제거되며, 소수 부분이 남아 있지 않을 경우 소수점 문자도 제거됩니다.
  • 무한대 및 NaN 변환 스타일에 대해서는 참고 를 확인하십시오.
해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음
n

이 함수 호출로 현재까지 쓰여진 문자 수 를 반환합니다.

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

구현 정의된 문자 시퀀스를 작성하여 pointer 를 정의합니다.

N/A N/A
void *
N/A N/A N/A N/A N/A N/A
참고 사항

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

NaN(Not-a-Number)은 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 로 변환됩니다. 가변 인수 함수가 호출될 때 발생하는 승격 때문에 이러한 타입의 값을 전달하는 것은 안전합니다.

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

메모리 쓰기 변환 지정자 %n 은 형식 문자열이 사용자 입력에 의존하는 보안 공격의 일반적인 대상입니다.

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

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

반환값

1,2) 성공 시 기록된 문자 수 또는 오류 발생 시 음수 값.
3) 성공 시 기록된 문자 수(종료 널 문자는 제외) 또는 오류 발생 시 음수 값.
4) 성공 시 충분히 큰 버퍼에 기록되었을 문자 수(종료 널 문자는 제외), 또는 오류 발생 시 음수 값. 따라서 (널 종료) 출력이 완전히 기록된 것은 반환된 값이 음수가 아니고 buf_size 보다 작은 경우에만 해당합니다.

참고 사항

POSIX는 오류 발생 시 errno 가 설정되도록 명시합니다. 또한 추가 변환 지정자를 명시하는데, 가장 주목할 만한 것은 인수 재정렬 지원입니다 ( n$ % 바로 뒤에 오는 경우 n 번째 인수를 나타냅니다).

std::snprintf buf_size 를 0으로, buffer 를 null 포인터로 호출하는 것은 (이중 호출의 오버헤드가 허용 가능할 때) 출력을 담기에 필요한 버퍼 크기를 결정하는 데 유용합니다:

auto fmt = "sqrt(2) = %f";
int sz = std::snprintf(nullptr, 0, fmt, std::sqrt(2));
std::vector<char> buf(sz + 1); // 널 종결자를 위한 +1 참고
std::sprintf(buf.data(), fmt, std::sqrt(2)); // 확실하게 맞음

예제

#include <cinttypes>
#include <cstdint>
#include <cstdio>
#include <limits>
int main()
{
    const char* s = "Hello";
    std::printf("Strings:\n"); // same as std::puts("Strings:");
    std::printf("\t[%10s]\n", s);
    std::printf("\t[%-10s]\n", s);
    std::printf("\t[%*s]\n", 10, s);
    std::printf("\t[%-10.*s]\n", 4, s);
    std::printf("\t[%-*.*s]\n", 10, 4, s);
    std::printf("Characters:\t%c %%\n", 'A');
    std::printf("Integers:\n");
    std::printf("\tDecimal:    \t%i %d %.6i %i %.0i %+i %i\n",
                                  1, 2,   3, 0,   0,  4,-4);
    std::printf("\tHexadecimal:\t%x %x %X %#x\n",
                                  5,10,10,  6);
    std::printf("\tOctal:      \t%o %#o %#o\n",
                                 10, 10,  4);
    std::printf("Floating point:\n");
    std::printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
    std::printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
    std::printf("\tScientific:\t%E %e\n", 1.5, 1.5);
    std::printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5);
    std::printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0/0.0, 1.0/0.0);
    std::printf("Variable width control:\n");
    std::printf("\tright-justified variable width: '%*c'\n", 5, 'x');
    int r = std::printf("\tleft-justified variable width : '%*c'\n", -5, 'x');
    std::printf("(the last printf printed %d characters)\n", r);
    std::printf("Fixed-width types:\n");
    std::uint32_t val = std::numeric_limits<std::uint32_t>::max();
    std::printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n",
                                                 val,            val);
}

가능한 출력:

Strings:
	[     Hello]
	[Hello     ]
	[     Hello]
	[Hell      ]
	[Hell      ]
Characters:	A %
Integers:
	Decimal:    	1 2 000003 0  +4 -4
	Hexadecimal:	5 a A 0x6
	Octal:      	12 012 04
Floating point:
	Rounding:	1.500000 2 1.30000000000000004440892098500626
	Padding:	01.50 1.50  1.50
	Scientific:	1.500000E+00 1.500000e+00
	Hexadecimal:	0x1.8p+0 0X1.8P+0
	Special values:	0/0=-nan 1/0=inf
Variable width control:
	right-justified variable width: '    x'
	left-justified variable width : 'x    '
(the last printf printed 41 characters)
Fixed-width types:
	Largest 32-bit value is 4294967295 or 0xffffffff

참고 항목

서식이 지정된 와이드 문자 출력을 stdout , 파일 스트림 또는 버퍼에 출력
(함수)
가변 인수 목록을 사용하여 서식이 지정된 출력을 stdout , 파일 스트림 또는 버퍼에 출력
(함수)
문자 문자열을 파일 스트림에 기록
(함수)
서식이 지정된 입력을 stdin , 파일 스트림 또는 버퍼에서 읽음
(함수)
(C++17)
정수 또는 부동 소수점 값을 문자 시퀀스로 변환
(함수)
(C++23)
인수의 서식이 지정된 표현을 사용하여 stdout 또는 파일 스트림에 출력
(함수 템플릿)
(C++23)
std::print 와 동일하지만 각 출력이 추가적인 새 줄로 종료됨
(함수 템플릿)
C 문서 참조: printf , fprintf , sprintf , snprintf