42SEOUL

[ft_printf] printf()

daykim 2022. 4. 22. 14:43

printf

데이터를 특정한 형식에 맞춰 stdout에 출력하는 함수

int printf(const char* format, ...);
  • 헤더 : <stdio.h>
  • return
    • 출력한 문자의 개수
    • error : -1

 

형식 태그

형식 태그에 대응하는 인자를 형식 태그가 지정한 형태로 치환해 출력

format 다음으로 오는 인자들의 개수는 반드시 형식 태그의 개수보다 같거나 많아야 한다.

%[flag][width][.정밀도][크기(length)]서식지정자

 

서식 지정자

서식 지정자 역할 자료형
%c 단일 문자 한 개 출력 char
%s 문자열 출력 char *
%p void * 형식의 포인터 인자(주소)를 16진수로 출력 void *
%d 10진수 숫자를 출력 int
%i 10진수 정수를 출력 int
%u 부호 없는 10진수 숫자를 출력 (unsigned) unsigned int
%x 소문자를 사용해 숫자를 16진수로 출력 unsigned int
%X 대문자를 사용해 숫자를 16진수로 출력 unsigned int
%% 퍼센트 기호(%)를 출력 char

 

플래그

- 왼쪽 정렬
0 수를 왼쪽으로 정렬하되 빈 칸을 삽입하는 대신 0을 삽입
.  
# o, x, X 서식 문자들과 사용되면 출력되는 값 앞에 각 0, 0x, 0X가 붙는다.
+ 출력 결과값이 양수여도, + 기호를 앞에 붙여서 출력
음수인 경우는 자동적으로 - 가 붙는다.
기본적으로 지정하지 않은 경우 음수에만 앞에 -가 붙는다.
(공백) 앞에 부호가 붙지 않는다면, 한 칸 띄워 출력

 

가변 인자 (variable argument)

헤더 : <stdarg.h>

위의 헤더 사용하면, 함수 선언 시 가변 인자를 가질 수 있다.

  • va_list : 길이가 변할 수 있는 인수들을 저장하는 가변의 저장 공간
  • va_start(ap, PN)
    • 가변 인자 가져올 수 있도록 pointer 설정
    • #define va_start(ap, v) (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)
      va_list 주소값에 고정인수 크기를 더한 위치로 ap를 초기화
    • ap : 가변 인자 저장하는 변수
    • PN : 고정 인수, 매크로 내부에서 PN을 기준으로 다음 메모리 pointer로 초기화
    • 위의 printf로 예를 들면 va_start(ap, format)
  • va_arg(ap, type)
    • ap 포인터가 위치한 부분의 데이터를 읽어 반환 후, ap 포인터를 type 길이만큼 뒤로 옮긴다.
    • #define va_arg(ap, t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
      1. ap += _INTSIZEOF(t) => ap 위치 이동
      2. ap - _INTSIZEOF(t) => 원래 ap위치의 값을 가져온다.
    • ap : 가변 인자 저장하는 변수
    • type : 가져올 크기
    • ap를 type 크기만큼 순방향으로 이동
  • va_end(ap) : 가변 인자 포인터 초기화
    • #define va_end(ap) (ap = (va_list)0)
#include <stdarg.h>

// 가변 인자를 저장하기 위한 변수 선언
va_list ap;

// 가변 인자의 시작 포인터 설정
va_start(ap, argc);

// 가변 인자의 값을 2번째 인자의 형식으로 return 받기
va_arg(ap, int);

// 사용 후 va_list 포인터 값을 null로 초기화
va_end(ap);

 

Line Buffering

버퍼에 개행 문자가 입력될 때 마다 출력

즉, 개행 문자가 들어오지 않으면 버퍼에 계속 쌓아두다가 더 이상 실행할 명령이 없을 때 해당 버퍼의 내용을 출력