PRINTF(3)

명칭
printf, fprintf, sprintf, snprintf, asprintf, vprintf, vfprintf, vsprintf, vsnprintf, vasprintf - 서식으로 변환해 출력

프로그램 라이브러리
libc

서식
<stdio.h> int printf(const char *format, ...) int fprintf(FILE *stream, const char *format, ...) int sprintf(char *str, const char *format, ...) int snprintf(char *str, size_t size, const char *format, ...) int asprintf(char **ret, const char *format, ...) <stdarg.h> int vprintf(const char *format, va_list ap) int vfprintf(FILE *stream, const char *format, va_list ap) int vsprintf(char *str, const char *format, va_list ap) int vsnprintf(char *str, size_t size, const char *format, va_list ap) int vasprintf(char **ret, const char *format, va_list ap)

해설
printf() 패밀리의 함수는, 이하로 설명한다 format 에 따라 출력을 실시합니다. printf() (와)과 vprintf() (은)는, 표준 출력 stdout 에 출력을 실시합니다. fprintf() (와)과 vfprintf() (은)는, 지정된 출력 stream 에 출력을 실시합니다. sprintf(), snprintf(), vsprintf(), vsnprintf() (은)는, 캐릭터 캐릭터 라인 str 에 출력을 실시합니다. asprintf() (와)과 vasprintf() (은)는, malloc(3) 그리고 새로운 캐릭터 라인을 동적으로 할당합니다.

이러한 함수는, format 캐릭터 라인에 의한 제어에 따라 출력을 실시합니다. 이 캐릭터 라인은, 그 후의 인수 (또는 stdarg(3) 의 가변장 인수 기능으로 액세스 할 수 있는 인수) (을)를 출력용으로 변환하는 방법을 지정합니다.

이 함수는, 출력된 캐릭터수 (캐릭터 라인에의 출력을 종료하는, 마지막 ‘\0’ (은)는 포함하지 않는다)를 돌려줍니다. snprintf() (와)과 vsnprintf() 의 경우만, size 의 제한이 없었다고 하면(자) 출력되었을 것이다 캐릭터수 (와 같이 캐릭터 라인의 마지막 ‘\0’ (은)는 포함하지 않는다)를 돌려줍니다.

asprintf() (와)과 vasprintf() (은)는, 정형된 캐릭터 라인을 격납하는데 충분한 크기의 버퍼를 가리키는 포인터를 *ret (으)로 설정합니다. 할당할 수 있었던 area가 불필요하게 되었을 경우는, 이 포인터를 free(3) 에 건네주어 해방해 주세요. 충분한 area를 할당할 수 없는 경우, asprintf() (와)과 vasprintf() (은)는 -1 을 되돌려, ret (을)를 NULL 포인터로 설정합니다.

snprintf() (와)과 vsnprintf() (은)는, 최대로 size-1 캐릭터만 출력 캐릭터 라인에 기입합니다 ( size 번째의 캐릭터는 종단의 ‘\0’ (이)가 됩니다). 반환값이 size 인수 이상인 경우는, 캐릭터 라인을 격납하려면 단인가 지났기 때문에, 출력된 캐릭터의 일부가 파기된 것이 됩니다.

sprintf() (와)과 vsprintf() (은)는, size 하지만 무한하다라고 가정합니다.

정형 캐릭터 라인은, 0 이상의 인스트럭션으로부터 구성되어 있습니다. 이 인스트럭션에는, 출력 스트림로 변경되지 않고 카피된다 통상 캐릭터 (% 이외), 및 0 이상의 후속의 인수를 꺼내는 변환 지정이 있습니다. 각각의 변환 지정은, % 캐릭터로부터 시작됩니다. 인수는, (형태 확장의 뒤에) 변환 지시자에게 적절히 대응할 필요가 있습니다. % 의 후에는, 이하가 차례로 나타납니다.

•   후에 $ 하지만 계속되는 10 진수 캐릭터 라인으로부터 구성되어 다음에 액세스 하는 인수를 지정하는 임의의 필드. 이 필드를 지정하지 않으면 마지막에 액세스 되었다 인수에 계속되는 인수가 사용됩니다. 인수에는 1 (으)로부터 시작되는 번호가 붙습니다. 서식 지정 캐릭터 라인으로, 액세스 할 수 없는 인수를 액세스 할 수 있는 인수에 점재하는 경우, 결과는 부정이 됩니다.

•   0 개 이상의 이하의 플래그

    -   값을 “대체 형식” (으)로 변환하는 것을 지정한다 # 캐릭터. c, d, i, n, p, s, 및 u 변환의 경우, 이 옵션은 효과를 발휘하지 않습니다. o 변환의 경우는, 수치의 정밀도가 올라, 출력 캐릭터 라인의 최초의 캐릭터가 0 이 됩니다 (명확한 정밀도의 0 으로 0 이 출력되는 경우를 제외하다). x 변환과 X 변환의 경우는, 0 이외의 결과의 전에 캐릭터 라인 ‘0x’ (X 변환의 경우는 ‘0X’) 하지만 붙습니다. e, E, f, g, 및 G 변환의 경우는, 소수점 이하가 없어도 소수점이 결과에 항상 포함됩니다 (통상의 경우, 소수점 이하가 있는 경우에 한해, 변환 결과에 소수점이 붙습니다). g 및 G 변환의 경우는, 후속의 0 이 통상의 경우와 같이 결과로부터 삭제되지 않습니다.

    -   0 (제로) 캐릭터의 패딩을 지정한다. n 변환을 제외한 모든 변환에서는, 변환치의 왼쪽으로 공백은 아니고 0 이 붙습니다. 수치 변환 (d, i, o, u, i, x, 및 X) 그리고 정밀도가 지정되어 있는 경우, 0 플래그는 무시됩니다.

    -   부의 필드폭을 나타낸다 - 플래그는 변환된 값이 필드 경계의 왼쪽에서 가지런히 할 수 있는 일을 나타냅니다. n 변환 이외에서는, 변환치의 왼쪽으로 공백이나 0 이 붙는 것이 아니라, 변환치의 오른쪽으로 공백이 붙습니다. - (와)과 0 (을)를 양쪽 모두 지정했을 경우는 0 하지만 무효가 됩니다.

    -   공백. 부호 첨부 변환 (d, e, E, f, g, G, 및 i) 그리고 작성되는 정의 수치의 전에 공백이 남습니다.

    -   + 캐릭터. 부호 첨부 변환으로 작성되는 수치의 전에 항상 부호가 붙습니다. + (와)과 공백을 양쪽 모두 지정했을 경우는 공백이 무효가 됩니다.

•   임의의 10 진수 캐릭터 라인. 최저 필드폭을 지정합니다. 변환치의 캐릭터수가 필드의 폭보다 적은 경우는, 왼쪽으로 공백이 붙어 (왼쪽 가지런히 하고 플래그를 지정했을 경우는 오른쪽으로 공백이 붙어) 필드의 폭에 맞출 수 있습니다.

•   피리어드. 의 다음에 임의의 숫자 캐릭터 라인이 계속되는 형식의 정밀도. 숫자 캐릭터 라인을 생략 했을 경우, 정밀도는 0 이 됩니다. d, i, o, u, x, 및 X 변환에서는, 이 정밀도의 최저 자리수가 출력됩니다. e, E, 및 f 변환에서는, 소수점 이하에 이 정밀도의 자리수가 출력됩니다. g 및 G 변환에서는, 이 정밀도의 최대 유효 자리수가 출력됩니다. s 변환에서는, 이 정밀도의 최대 캐릭터수가 캐릭터 라인으로부터 출력됩니다.

•   옵션 캐릭터 h d, i, o, u, x, 및 X 변환이 short int 인수인가 unsigned short int 인수에 대응하는 것, 또는 후의 n 변환이 short int 인수의 포인터에 대응하는 것을 지정합니다.

•   옵션 캐릭터 l (소문자의 L). 후의 d, i, o, u, x, 및 X 변환이 long int 인수인가 unsigned long int 인수의 포인터에 적용되는 것, 또는 후의 n 변환이 long int 인수의 포인터에 대응하는 것을 지정합니다.

•   옵션 캐릭터 ll (소문자의 L 가 2 개). 후의 d, i, o, u, x, 및 X 변환이 long long int 인수인가 unsigned long long int 인수에 대응하는 것, 또는 후의 n 변환이 long long int 인수의 포인터에 대응하는 것을 지정합니다.

•   옵션 캐릭터 q, d, i, o, u, x, 및 X 변환이 quad int 인수인가 unsigned quad int 인수에 대응하는 것, 또는 후의 n 변환이 quad int 인수의 포인터에 대응하는 것을 지정합니다.

•   옵션 캐릭터 L e, E, f, g, 및 G 변환이 long double 인수에 대응하는 것을 지정합니다.

•   적용하는 변환의 형태를 지정하는 캐릭터.

필드폭이나 정밀도, 또는 그 양쪽 모두는, asterisk ‘*’ , 또는 숫자 캐릭터 라인 대신에 1 개(살) 이상의 10 진수와 ‘$’ 하지만 계속되는 asterisk로 지정할 수 있습니다. 이 경우, int 인수는 필드폭이나 정밀도를 제공합니다. 부의 필드폭은, 정의 필드폭이 계속되는 왼쪽 가지런히 하고 플래그로서 다루어집니다. 부의 정밀도는, 결핍 하고 있는 것으로서 다루어집니다. 1 개의 서식 인스트럭션에 위치 인수 (nn$) (와)과 위치 이외의 인수가 혼재하고 있는 경우, 결과는 미정도리가 됩니다.

변환 지시자와 그 의미는 다음과 같습니다.

diouxX
    int 인수 (또는 적절한 가변 인수)가, 부호 첨부 10 진 (d (와)과 i) , 부호 없음 8 진 (o) , 부호 없음 10 진 (u) , 부호 없음 16 진 (x (와)과 X) 에 변환됩니다. x 변환에는 캐릭터 abcdef , X 변환에는 캐릭터 ABCDEF 하지만 사용됩니다. 정밀도는, 출력하는 최저 자리수를 지정합니다. 변환치로 적은 자리수 밖에 필요없는 경우는, 왼쪽으로 0 이 붙습니다.

DOU long int 인수가, 부호 첨부 10 진, 부호 없음 8 진, 부호 없음 10 진에, 각각의 형식이 ld, lo, 및 lu 인것 같이 변환됩니다. 이 변환 캐릭터에는 문제가 있으므로, 최종적으로는 출력되지 않습니다.

eE  double 인수를 말 수 있어 [-]d.ddde\*[Pm]dd 의 스타일에 변환됩니다. 소수점 이상은 1 자리수로, 소수점 이하의 자리수는 정밀도와 동일해집니다. 정밀도가 지정되어 있지 않은 경우는 6 이 가정됩니다. 정밀도가 0 인 경우, 소수점은 출력되지 않습니다. E 변환에서는, 캐릭터 E (e (은)는 아니다)가 사용되어 지수가 도입됩니다. 지수에는, 최저 2 자리수가 항상 포함됩니다. 값이 0 인 경우, 지수는 00 이 됩니다.

f   double 인수를 말 수 있어 [-]ddd.ddd, 의 스타일로 10 진에 변환됩니다. 소수점 이하의 자리수는, 정밀도 지정에 동일해집니다. 정밀도가 지정되어 있지 않은 경우는 6 이 가정됩니다. 정밀도가 0 인 경우, 소수점은 출력되지 않습니다. 소수점이 출력되는 경우는, 소수점 이상으로 최저 1 자리수가 출력됩니다.

gG  double 인수가, 스타일 f 인가 e (G 변환의 경우는 E) 그리고 변환됩니다. 정밀도는 유효 자리수를 지정합니다. 정밀도가 지정되어 있지 않은 경우는 6 이 가정됩니다. 정밀도가 0 인 경우는 1 으로서 다루어집니다. 변환 후의 지수가 -4 보다 작은가 정밀도 이상인 경우는, 스타일 e 하지만 사용됩니다. 후속의 0 은, 결과의 소수부로부터 삭제됩니다. 소수점은, 소수점 이하에 최악이어도 1 자리수 있는 경우에 출력됩니다.

c   int 인수가 unsigned char 에 변환되어 변환된 캐릭터가 출력됩니다.

s   char * 인수가, 캐릭터형의 배열을 가리키는 포인터 (캐릭터 라인에의 포인터)(으)로 간주해집니다. 배열의 캐릭터는, 마지막 눌 캐릭터까지 출력됩니다 ( NULL 캐릭터는 출력되지 않습니다). 정밀도가 지정되어 있는 경우, 지정된 수이상은 출력되지 않기 때문에, NULL 캐릭터는 필요 없습니다. 정밀도가 지정되어 있지 않은 경우, 또는 정밀도가 배열의 사이즈 이상인 경우, 배열의 마지막에는 눌 캐릭터가 필요합니다.

p   void * 포인터 인수가, 16 진으로 ‘(%#x’ 인가 ‘%#lx’ 에서의 같게) 출력됩니다.

n   지금까지 출력된 캐릭터수가, int * 포인터 인수 (또는 가변 포인터 인수) 하지만 지정하는 정수에 보존됩니다. 인수는 변환되지 않습니다.

%   ‘%’ 하지만 출력됩니다. 변환되는 인수는 없습니다. 완전한 변환 지정은 ‘%%’ 입니다.

필드폭이 존재하지 않는 경우, 또는 필드폭이 작은 경우에서도, 필드는 잘라 버릴 수 없습니다. 변환 결과가 필드폭보다 큰 경우, 필드는 변환 결과를 수용할 수 있게 될 때까지 확장됩니다.

예
weekday (와)과 month 하지만 캐릭터 라인에의 포인터인 경우에 “Sunday, July 3, 10:02” 그렇다고 하는 형식에서 일자와 시각을 출력하는 경우:

    #include <stdio.h>
    fprintf(stdout, "%s, %s %d, %. 2d:%. 2d\n",
    	weekday, month, day, hour, min);

를 소수 제 5 위까지 출력하는 경우:

    #include <math.h>
    #include <stdio.h>
    fprintf(stdout, "pi = %. 5f\n", 4 * atan(1.0));

128 바이트의 캐릭터 라인을 할당해, 거기에 출력하는 경우:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    char *newfmt(const char *fmt, ...)
    {
    		char *p;
    		va_list ap;
    		if ((p = malloc(128)) == NULL)
    			return (NULL);
    		va_start(ap, fmt);
    		(void) vsnprintf(p, 128, fmt, ap);
    		va_end(ap);
    		return (p);
    }

관련 항목
printf(1), scanf(3)

표준
fprintf(), printf(), sprintf(), vprintf(), vfprintf(), 및 vsprintf() 함수는, isoC 에 적합하고 있습니다.

역사
asprintf() 함수와 vasprintf() 함수는, GNU C 프로그램 라이브러리에 추가되었습니다. 이것은, FreeBSD 2.2 그리고 Peter Wemm <peter@FreeBSD.org> 에 의해 실장되었습니다만, OpenBSD 2.3 그럼 후에 Todd C. Miller <Todd.Miller@courtesan.com> 의 시스템으로 옮겨놓을 수 있었습니다.

버그
변환 형식 %D, %O, 및 %U (은)는 표준적이 아니고, 하위 호환성을 유지하기 위해서(때문에) 제공되고 있습니다. %p 형식에 ( 0 플래그나 정밀도를 지정하는 것으로) 0 을 패딩 하는 것, %n 변환과 %p 변환으로 # 플래그를 지정하는 것, %Ld (와)과 같이 무의미한 편성은 표준적이지 않습니다. 이러한 편성은 피해 주세요.

sprintf() (와)과 vsprintf() 그럼 무한하게 긴 캐릭터 라인이 가정되므로, 호출측에서는 실제의 공간을 오버플로우 하지 않게 주의할 필요가 있습니다. 오버플로우 하지 않는 것을 프로텍션하는 것은 곤란합니다. 안전이기 때문에, 대신에 snprintf() 인터페이스를 사용해 주세요. 유감스럽지만, 이 인터페이스는 이식할 수 없습니다.