프로그램 라이브러리

Standard C Library (libc, -lc)

서식

#include <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, ...)
#include <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, Ns, -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 . ddd e \*[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);

(Pi 를 소수 제 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);
}

관련 항목

표준

fprintf(), printf(), sprintf(), vprintf(), vfprintf(), 및 vsprintf() 함수는, ISO/IEC 9899:1990 ("ISO C90") 에 적합하고 있습니다.

역사

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

버그

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

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


'Linux > C/C++' 카테고리의 다른 글

Configuration module to update in a file  (0) 2012.07.02
Comparing floating point numbers  (0) 2012.06.18
va_start, va_arg, va_end  (0) 2012.06.08
Local IP 가져오는 C 소스  (0) 2012.03.04
heap Memory Issue  (0) 2011.12.09