std:: printf, std:: fprintf, std:: sprintf, std:: snprintf
|
헤더 파일에 정의됨
<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부터) |
주어진 위치에서 데이터를 로드하고, 이를 문자 문자열 등가물로 변환한 후 다양한 싱크에 결과를 기록합니다.
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
|
단일 문자 를 출력합니다.
|
N/A | N/A |
int
|
std::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 |
d
i
|
부호 있는 정수 를 10진수 표현 [-]dddd 로 변환합니다.
|
signed
char
|
short
|
int
|
long
|
long
long
|
※
|
N/A | ||
o
|
부호 없는 정수 를 8진수 표현 oooo 로 변환합니다.
|
unsigned
char
|
unsigned
short
|
unsigned
int
|
unsigned
long
|
unsigned
long
long
|
std::ptrdiff_t
의 부호 없는 버전
|
해당 없음 | ||
x
X
|
부호 없는 정수 를 16진수 표현 hhhh 로 변환합니다.
|
N/A | ||||||||
u
|
부호 없는 정수 를 10진수 표현 dddd 로 변환합니다.
|
N/A | ||||||||
f
F
(C++11)
|
부동소수점 숫자 를 [-]ddd.ddd 스타일의 10진수 표기법으로 변환합니다.
|
해당 없음 | 해당 없음 |
double
|
double
(C++11)
|
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
long
double
|
e
E
|
부동 소수점 숫자 를 10진수 지수 표기법으로 변환합니다.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
a
A
(C++11) |
부동소수점 숫자 를 16진수 지수 표기법으로 변환합니다.
|
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | |||
g
G
|
부동소수점 숫자 를 값과 정밀도 에 따라 십진법 또는 십진법 지수 표기법으로 변환합니다.
|
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | |||
n
|
이 함수 호출로 현재까지 쓰여진 문자 수 를 반환합니다.
|
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 |
| 참고 사항 | ||||||||||
|
부동 소수점 변환 함수는 무한대를
NaN(Not-a-Number)은
char , unsigned char , signed char , short , 그리고 unsigned short 를 출력하는 데 사용되는 변환 지정자는 기본 인수 승격 의 승격된 타입을 기대하지만, 값을 출력하기 전에 char , unsigned char , signed char , short , 그리고 unsigned short 로 변환됩니다. 가변 인수 함수가 호출될 때 발생하는 승격 때문에 이러한 타입의 값을 전달하는 것은 안전합니다.
고정 너비 문자 타입(
std::int8_t
등)에 대한 올바른 변환 지정자는 헤더
<cinttypes>
에 정의되어 있습니다(비록
PRIdMAX
,
PRIuMAX
등이
메모리 쓰기 변환 지정자
각 변환 지정자의 동작 이후에는
시퀀스 포인트
가 있습니다; 이는 여러
변환 지정자가 유효하지 않으면 동작은 정의되지 않습니다. |
||||||||||
반환값
참고 사항
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
|
|