snprintf(3)
#include <stdio.h>
int snprintf(char *str, size_t size, const char *format, ...);
snprintf(3)함수는 여러 개의 데이터를 형식(format)에 맞추어 문자열(str)에 저장하는 동적 파라미터(갯수, 타입이 정해지지 않은)함수입니다. 이 함수는 동적 파라미터 함수이므로 format 문자열을 parsing하여 format 뒤에 따라오는 변수들의 갯수와 type을 짐작하여 format에 맞는 형태로 문자열에 저장됩니다. 따라서 format의 형식을 잘 이해하는 것이 이 함수를 사용하는 데에 있어서 매우 중요합니다. 또한 sprintf(3)함수와는 달리 str 변수의 크기를 size로 넘겨서 그 보다 큰 데이터는 잘리게 되므로 buffer overflow를 막을 수 있는 함수입니다. 만약 데이터가 잘리게 된다면 size번째에 0x00 데이터가 저장되어 null-terminated 문자열을 보장합니다.
파라미터
str
- format의 형식에 맞춰서 저장될 buffer
size
- buffer에 저장할 수 있는 크기.
- 저장될 문자열이 size보다 작으면 전체 문자열이 저장되고
그렇지 않으면 잘려서 저장되며 NULL문자로 끝마칩니다.
format
- 데이터를 출력할 형식을 지정하는 문자열
- format에는 그냥 출력할 문자열과 뒤에 따른 변수(...)의 데이터를 치환하기 위한 형식을 저장합니다.
...
- format에 나열된 순서에 맞는 데이터
RETURN
0 이상
- 출력된 바이트 수
format의 구성
% flag_character field_width .pricision length_modifier conversion_specifier
- % : 한 개의 데이터 format 시작
- flag_character : 데이터의 정렬 또는 빈자리 채우는 방식에 대한 표현 (optional)
- field_width : 전체 폭 설정 (optional)
- .pricision : 정밀도 폭 설정 또는 실수의 소숫점 자리수 설정 (optional)
- length_modifier : 동적 파라미터의 데이터 type
한 개의 데이터 출력 format은 %로 시작하여 flag_character field_width .pricision length_modifier conversion_specifier 순서 대로 표시해야 합니다. flag_character field_width .pricision length_modifier는 optional로 반드시 사용되는 것은 아닙니다.
%
1개의 동적 파라미터 변수에 대한 formatting을 시작하는 표시
flag_character (optional)
#
- 16진수 표기 0x 또는 0X 표시 - conversion_specifier(x, X)인 경우만
0
- conversion_specifier가 숫자형인 경우에 좌측에 0으로 채움
-
- 데이터를 좌정렬
+
- conversion_specifier가 숫자형인 경우에 +값의 경우 +를 붙임
' '
- 데이터가 모자라는 경우는 space로 채움 (' '가 없어도 space로 채우므로 잘 사용 안함
flag_character는 optional로 0개 또는 여러개의 조합으로 사용 가능합니다.
field_width (optional)
출력할 전체 폭 설정
- 최소폭이므로 데이터의 길이가 이 값을 초과하면 데이터가 잘리는 것이 아니라 더 길게 표시됩니다.
숫자 : 고정 폭으로 지정됨.
예)
printf("[%10d]\n", 200);
결과>
[200 ]
* : 폭을 파라미터로 받아서 동적으로 정함
예)
int width = 6;
printf("[%*d]\n", width, 200);
결과>
[200 ]
.precision (optional)
.숫자
- 고정 길이 지정
.*
- 변수로 지정(...파라미터에 길이 정보가 추가되어야 합니다.)
conversion_specifier가 실수형 변수이면
- 소수점 이하 몇 자리까지 표현할 것인지를 설정합니다.
conversion_specifier가 실수형 이외의 변수이면
- 최대폭을 지정합니다. 최대폭보다 긴 데이터는 앞에서부터 폭까지만 출력되고 잘립니다.
length_modifier (optional)
conversion_specifier의 데이터 type의 크기를 지정합니다.
hh
- 정수형의 데이터를 signed char 또는 unsigned char로 데이터 크기를 조정입니다.
ex)
printf("[%hhd]\n", 1000);
결과:
[-24]
printf("[%hhu]\n", 1000);
결과:
[232]
h
- 정수형의 데이터를 signed short int 또는 unsigned short int로 데이터 크기를 조정합니다.
l
- 정수형의 데이터를 long int 또는 unsigned long으로 데이터 크기를 조정합니다.
ll
- 정수형의 데이터를 long long int 또는 unsigned long long int로 데이터 크기를 조정합니다.
q
- ll과 같음
L
- 실수형 데이터를 long double로 데이터 크기를 조정합니다.
(a, A, e, E, f, F, g, G)
conversion_specifier
동적 파라미터(...) 변수의 데이터 type
d 또는 i
- signed int 표현
o
- 8진수 unsigned int 표현
u
- 10진수 unsigned int 표현
x, X
- 16진수 unsigned int 표현
- flag_character #를 사용하는 경우 x는 0x로, X는 0X 표시함
e, E
- 실수를 표시할 때에 [-]d.dddE[±]dd 형식으로 표시함
ex).
3.12e-5 , 3.12E-5
-2.74e+6 , -2.74E+6
f, F
- 실수를 표시할 때에 [-]ddd.ddd 형식으로 표시함
ex).
12567.45
g, G
- 실수를 f, F로 표시할 수 있는 범위이면 f, F 표시법을 그렇지 않으면 e, E 표시법을 사용함
a, A
- 실수를 16진 표기법으로 표시함 ([-]0xh.hhhhp±)
c
- char 를 표시함
s
- const char * 를 표시함
p
- pointer변수의 번지를 출력함
%#x 또는 %#lx 와 같음
m
- printf("%m")은 printf("%s", strerror(errno))와 같음.
- 동적 파라미터가 없이 표시됨
%
- %자체를 표시함
Sample은 printf(3)함수를 참고하세요.
see also : printf(3) fprintf(3) sprintf(3)
'C언어 header > stdio.h' 카테고리의 다른 글
sprintf(3) - 데이터를 format된 형태로 buffer에 저장 (0) | 2019.10.08 |
---|---|
fprintf(3) - 데이터를 format된 형태로 file로 출력 (0) | 2019.10.04 |
printf(3) - 데이터를 format된 형태로 화면 출력 (0) | 2019.10.04 |
fdopen(3) - file descriptor를 stream으로 (0) | 2019.09.24 |
rename(3) - 파일명 또는 디렉토리의 이름 변경 및 위치 변경 (0) | 2019.09.24 |