sprintf(3)

#include <stdio.h>

int sprintf(char *str, const char *format, ...);

sprintf(3)함수는 여러 개의 데이터를 형식(format)에 맞추어 문자열(str)에 저장하는 동적 파라미터(갯수, 타입이 정해지지 않은)함수입니다. 이 함수는 동적 파라미터 함수이므로 format 문자열을 parsing하여 format 뒤에 따라오는 변수들의 갯수와 type을 짐작하여 format에 맞는 형태로 문자열에 저장됩니다. 따라서 format의 형식을 잘 이해하는 것이 이 함수를 사용하는 데에 있어서 매우 중요합니다.

 

이 함수는 str 문자열에 메모리가 얼마만큼 할당되어 있는 지 알 수 없고 format에 의해서 데이터의 폭이 얼마만큼 될 지를 알 수 없어서 buffer overflow가 발생할 수 있는 보안에 취약함수입니다. (snprintf로 대체해서 사용필요)

 

 

파라미터

str
    - format의 형식에 맞춰서 저장될 buffer
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 : snprintf(3) printf(3) fprintf(3)

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요