검색결과 리스트
글
프로그램 라이브러리
서식
#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)
해설
이러한 함수는, 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 * 포인터 인수 (또는 가변 포인터 인수) 하지만 지정하는 정수에 보존됩니다. 인수는 변환되지 않습니다. |
% | `%' 하지만 출력됩니다. 변환되는 인수는 없습니다. 완전한 변환 지정은 `%%' 입니다. |
필드폭이 존재하지 않는 경우, 또는 필드폭이 작은 경우에서도, 필드는 잘라 버릴 수 없습니다. 변환 결과가 필드폭보다 큰 경우, 필드는 변환 결과를 수용할 수 있게 될 때까지 확장됩니다.
예
#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); }
관련 항목
표준
역사
버그
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 |
RECENT COMMENT