printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
| 헤더 <stdio.h>
|
||
int printf( const char* format, ... );
|
에 정의됨 (1) | (C99까지) |
int printf( const char* restrict format, ... );
|
(C99부터) | |
int fprintf( FILE* stream, const char* format, ... );
|
(2) | (C99까지) |
int fprintf( FILE* restrict stream, const char* restrict format, ... );
|
(C99부터) | |
int sprintf( char* buffer, const char* format, ... );
|
(3) | (C99까지) |
int sprintf( char* restrict buffer, const char* restrict format, ... );
|
(C99부터) | |
int snprintf( char* restrict buffer, size_t bufsz,
const char* restrict format, ... );
|
(4) | (C99부터) |
int printf_s( const char* restrict format, ... );
|
(5) | (C11부터) |
int fprintf_s( FILE* restrict stream, const char* restrict format, ... );
|
(6) | (C11부터) |
int sprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, ... );
|
(7) | (C11부터) |
int snprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, ... );
|
(8) | (C11부터) |
주어진 위치에서 데이터를 로드하여 문자열 등가물로 변환하고 결과를 다양한 대상/스트림에 씁니다:
stream에 씁니다.buffer에 씁니다. 쓰여질 문자열(종료 널 문자 포함)이 buffer이 가리키는 배열의 크기를 초과하면 동작은 정의되지 않습니다.buffer에 씁니다. 최대 bufsz - 1 문자가 쓰여집니다. 결과 문자 문자열은 bufsz이 0이 아니면 널 문자로 종료됩니다. bufsz이 0이면 아무 것도 쓰여지지 않으며 buffer은 널 포인터일 수 있지만, 반환 값(널 종결자를 포함하지 않고 쓰여질 바이트 수)은 여전히 계산되어 반환됩니다.- 변환 지정자
%n가format - 에 존재함
%s에 해당하는 인수 중 하나가 널 포인터임 stream또는format또는buffer이 널 포인터임bufsz이 0이거나 RSIZE_MAX- 보다 큼
- 문자열 및 문자 변환 지정자에서 인코딩 오류 발생
sprintf_s(buffer의 경우에만),bufsz에 저장될 문자열(끝 널 포함)이
printf_s모든 경계 검사 함수와 마찬가지로, fprintf_s, sprintf_s, snprintf_s, __STDC_LIB_EXT1__는 구현이 __STDC_WANT_LIB_EXT1__를 정의하고 사용자가 1를 포함하기 전에 <를 정수 상수 >로 정의한 경우에만 사용할 수 있습니다.
매개변수
| stream | - | 출력 파일 스트림 |
| buffer | - | 쓰기 위한 문자 문자열에 대한 포인터 |
| bufsz | - | 최대 bufsz - 1 문자(널 종결자 제외)를 쓸 수 있음
|
| format | - | 데이터 해석 방법을 지정하는 널 종료 바이트 문자열에 대한 포인터 |
| ... | - | 출력할 데이터를 지정하는 인수. 기본 인수 승격 이후의 인수가 해당 변환 사양에 의해 예상된 유형(예상 유형은 승격된 유형 또는 승격된 유형과 호환되는 유형)이 아니거나, format에 필요한 것보다 적은 인수가 있는 경우 동작은 정의되지 않습니다. format에 필요한 것보다 많은 인수가 있으면 추가 인수는 평가되고 무시됩니다.
|
format 문자열은 출력 스트림에 그대로 복사되는 일반 바이트 문자( % 제외)와 변환 사양으로 구성됩니다. 각 변환 사양은 다음 형식을 갖습니다:
- 도입
%문자.
- 도입
- (선택사항) 변환의 동작을 수정하는 하나 이상의 플래그:
-: 변환 결과가 필드 내에서 왼쪽 정렬됩니다(기본적으로 오른쪽 정렬).+: 부호 있는 변환의 부호가 항상 결과 앞에 붙습니다(기본적으로 결과는 음수일 때만 마이너스가 앞에 붙습니다).- 공백: 부호 있는 변환 결과가 부호 문자로 시작하지 않거나 비어 있으면 결과 앞에 공백이 붙습니다.
+플래그가 있으면 무시됩니다. #: 대체 형식의 변환이 수행됩니다. 정확한 효과는 아래 표를 참조하십시오. 그렇지 않으면 동작이 정의되지 않습니다.0: 정수 및 부동 소수점 숫자 변환의 경우 필드를 채우기 위해 공백 문자 대신 선행 0이 사용됩니다. 정수 숫자의 경우 정밀도가 명시적으로 지정되면 무시됩니다. 이 플래그를 사용하는 다른 변환은 정의되지 않은 동작을 초래합니다.-플래그가 있으면 무시됩니다.
- (선택사항) 최소 필드 너비를 지정하는 정수 값 또는
*. 결과는 필요한 경우 왼쪽 정렬 시 오른쪽에, 오른쪽 정렬 시 왼쪽에 공백 문자로 채워집니다(기본값).*을 사용하면 너비가 변환될 인수와 정밀도가 제공되는 경우 그 앞에 오는int유형의 추가 인수로 지정됩니다. 인수 값이 음수이면-플래그가 지정되고 양의 필드 너비가 적용됩니다(참고: 이것은 최소 너비입니다. 값이 잘리지 않습니다).
- (선택사항) 최소 필드 너비를 지정하는 정수 값 또는
- (선택사항)
.뒤에 정수 또는*이 오거나, 아무것도 오지 않으며 변환의 정밀도를 지정합니다.*을 사용하면 정밀도가 변환될 인수 앞에 오고 최소 필드 너비가 제공되는 경우 그 뒤에 오는int유형의 추가 인수로 지정됩니다. 이 인수의 값이 음수이면 무시됩니다. 숫자나*이 모두 사용되지 않으면 정밀도는 0으로 간주됩니다. 정밀도의 정확한 효과는 아래 표를 참조하십시오.
- (선택사항)
- (선택사항) 길이 수정자는 인수의 크기를 지정합니다(변환 형식 지정자와 함께 해당 인수의 유형을 지정합니다).
- 변환 형식 지정자.
사용 가능한 형식 지정자는 다음과 같습니다:
| 변환 지정자 |
설명 | 예상 인수 유형 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 길이 수정자→ | hh | h | 없음 | l | ll | j | z | t | L | |
| C99부터만 가능→ | 예 | 예 | 예 | 예 | 예 | |||||
%
|
리터럴 %을 씁니다. 전체 변환 사양은 %%이어야 합니다.
|
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
c
|
단일 문자를 씁니다.
|
해당 없음 | 해당 없음 | int |
wint_t |
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
s
|
문자 문자열을 씁니다.
|
해당 없음 | 해당 없음 | char* |
wchar_t* |
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
di
|
부호 있는 정수를 십진수 표현 [-]dddd로 변환합니다.
|
signed char |
short |
int |
long |
long long |
intmax_t |
※ |
ptrdiff_t |
해당 없음 |
bB (선택사항)
(C23) |
부호 없는 정수를 이진수 표현 bbbb로 변환합니다.
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
ptrdiff_t |
의 부호 없는 버전 |
o
|
해당 없음부호 없는 정수를 8진수 표현 oooo
|
이 쓰여집니다. | ||||||||
xX
|
해당 없음부호 없는 정수를 16진수 표현 hhhh
|
는 변환된 값이 0이 아닌 경우 결과 앞에 붙습니다. | ||||||||
u
|
해당 없음부호 없는 정수를 십진수 표현 dddd
|
이면 결과는 문자가 없습니다. | ||||||||
fF 해당 없음
|
(C99)부동 소수점 숫자를 [-]ddd.ddd
|
를 참조하십시오. | 해당 없음 | double |
double 해당 없음 |
(C99) | 해당 없음 | 해당 없음 | 해당 없음 | long double |
eE
|
해당 없음부동 소수점 숫자
|
를 참조하십시오. | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | |||
aA
해당 없음 |
(C99)부동 소수점 숫자
|
를 참조하십시오. | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | |||
gG
|
해당 없음부동 소수점 숫자를 값과 정밀도
|
를 참조하십시오. | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | |||
n
|
해당 없음이 함수 호출에 의해 지금까지 쓰여진 문자 수
|
signed char* |
short* |
int* |
long* |
long long* |
intmax_t * |
※ |
ptrdiff_t * |
해당 없음 |
p
|
포인터를 정의하는 구현 정의 문자 시퀀스를 씁니다. |
해당 없음 | 해당 없음 | void* |
해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
| 참고 | ||||||||||
|
부동 소수점 변환 함수는 무한대를 NaN은 변환
고정 너비 문자 유형(int8_t 등)에 대한 올바른 변환 사양은 헤더 <inttypes.h>에 정의되어 있습니다( PRIdMAX, PRIuMAX 등은 메모리 쓰기 변환 지정자 각 변환 지정자 동작 후에 시퀀스 포인트가 있습니다. 이는 여러 변환 사양이 유효하지 않으면 동작이 정의되지 않습니다. | ||||||||||
반환 값
buffer에 쓰여진 문자 수(종료 널 문자 제외) 또는 인코딩 오류(문자열 및 문자 변환 지정자의 경우)가 발생한 경우 음수 값.buffer이 무시되었다면 bufsz에 쓰여졌을 문자 수(종료 널 문자 포함하지 않음) 또는 인코딩 오류(문자열 및 문자 변환 지정자의 경우)가 발생한 경우 음수 값.buffer에 쓰여진 문자 수(널 문자 제외, 단 buffer이 널 포인터가 아니고 bufsz이 0이 아니며 RSIZE_MAX보다 크지 않은 한 항상 쓰여짐) 또는 런타임 제약 조건 위반 시 0, 인코딩 오류 시 음수 값.buffer이 널 포인터가 아니고 bufsz이 0이 아니며 RSIZE_MAX보다 크지 않은 한 항상 쓰여짐)를 포함하지 않고 buffer이 무시되었다면 bufsz에 쓰여졌을 문자 수, 또는 런타임 제약 조건 위반이나 인코딩 오류가 발생한 경우 음수 값.참고
C 표준과 POSIX는 인수가 대상 버퍼와 겹칠 때 sprintf 및 그 변형의 동작이 정의되지 않는다고 명시합니다. 예:
sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behaviorPOSIX는 오류 시 errno가 설정된다고 명시합니다. 또한 추가 변환 사양, 특히 인수 재정렬 지원( n$ 바로 뒤에 %는 n번째 인수를 나타냄)을 명시합니다.
snprintf을 0 bufsz과 널 포인터 buffer로 호출하는 것은 필요한 버퍼 크기를 결정하여 출력을 포함하는 데 유용합니다:
const char fmt[] = "sqrt(2) = %f";
int sz = snprintf(NULL, 0, fmt, sqrt(2));
char buf[sz + 1]; // note +1 for terminating null byte
snprintf(buf, sizeof buf, fmt, sqrt(2));snprintf_ssnprintf은 sprintf_s와 마찬가지로 출력을 bufsz - 1에 맞게 잘라냅니다.
예제
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
int main(void)
{
const char* s = "Hello";
printf("Strings:\n"); // same as puts("Strings");
printf(" padding:\n");
printf("\t[%10s]\n", s);
printf("\t[%-10s]\n", s);
printf("\t[%*s]\n", 10, s);
printf(" truncating:\n");
printf("\t%.4s\n", s);
printf("\t%.*s\n", 3, s);
printf("Characters:\t%c %%\n", 'A');
printf("Integers:\n");
printf("\tDecimal:\t%i %d %.6i %i %.0i %+i %i\n",
1, 2, 3, 0, 0, 4,-4);
printf("\tHexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6);
printf("\tOctal:\t\t%o %#o %#o\n", 10, 10, 4);
printf("Floating-point:\n");
printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
printf("\tScientific:\t%E %e\n", 1.5, 1.5);
printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5);
printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0 / 0.0, 1.0 / 0.0);
printf("Fixed-width types:\n");
printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n",
UINT32_MAX, UINT32_MAX );
}가능한 출력:
Strings:
padding:
[ Hello]
[Hello ]
[ Hello]
truncating:
Hell
Hel
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
Fixed-width types:
Largest 32-bit value is 4294967295 or 0xffffffff참조
- C23 표준 (ISO/IEC 9899:2024):
- 7.21.6.1 The fprintf function (p: TBD)
- 7.21.6.3 The printf function (p: TBD)
- 7.21.6.5 The snprintf function (p: TBD)
- 7.21.6.6 The sprintf function (p: TBD)
- K.3.5.3.1 The fprintf_s function (p: TBD)
- K.3.5.3.3 The printf_s function (p: TBD)
- K.3.5.3.5 The snprintf_s function (p: TBD)
- K.3.5.3.6 The sprintf_s function (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
- 7.21.6.1 The fprintf function (p: 225-230)
- 7.21.6.3 The printf function (p: 236)
- 7.21.6.5 The snprintf function (p: 237)
- 7.21.6.6 The sprintf function (p: 237)
- K.3.5.3.1 The fprintf_s function (p: 430)
- K.3.5.3.3 The printf_s function (p: 432)
- K.3.5.3.5 The snprintf_s function (p: 432-433)
- K.3.5.3.6 The sprintf_s function (p: 433)
- C11 표준 (ISO/IEC 9899:2011):
- 7.21.6.1 The fprintf function (p: 309-316)
- 7.21.6.3 The printf function (p: 324)
- 7.21.6.5 The snprintf function (p: 325)
- 7.21.6.6 The sprintf function (p: 325-326)
- K.3.5.3.1 The fprintf_s function (p: 591)
- K.3.5.3.3 The printf_s function (p: 593-594)
- K.3.5.3.5 The snprintf_s function (p: 594-595)
- K.3.5.3.6 The sprintf_s function (p: 595-596)
- C99 표준 (ISO/IEC 9899:1999):
- 7.19.6.1 The fprintf function (p: 274-282)
- 7.19.6.3 The printf function (p: 290)
- 7.19.6.5 The snprintf function (p: 290-291)
- 7.19.6.6 The sprintf function (p: 291)
- C89/C90 표준 (ISO/IEC 9899:1990):
- 4.9.6.1 The fprintf function
- 4.9.6.3 The printf function
- 4.9.6.5 The sprintf function
같이 보기
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
형식화된 와이드 문자 출력을 stdout, 파일 스트림 또는 버퍼에 인쇄합니다 (함수) |
(C99)(C11)(C11)(C11)(C11) |
가변 인수 목록을 사용하여 형식화된 출력을 stdout, 파일 스트림 또는 버퍼에 인쇄합니다 (함수) fputs |
| (함수) scanf | |
(C11)(C11)형식화된 입력을 |
stdin, 파일 스트림 또는 버퍼에서 읽습니다(함수) C++ 문서 |
for printf, fprintf, sprintf, snprintf
| |