본문 바로가기
42seoul

printf : 사용자가 format을 지정해 출력할 수 있는 함수

by objet 2022. 4. 2.
printf의 개요

 

ft_printf의 프로토타입은 int ft_printf(const char *format, ...)

parameter가 들어갈 자리에 ...이 들어가있는 유형을 가변 인자라고 한다.

printf("%d, %s, %x", a, b, c); 이 코드처럼 인자의 수, 타입을 사용자가 유동적으로 조절할 수 있다.

(주의! 가변인자를 사용하기 위해서는 최소 1개 이상의 고정 인자가 있어야 한다.)

 

가변인수 리스트

 

가변 인자를 처리하기 위하여 가변 인수 리스트를 사용한다.

va_list라는 타입은 가변 인수들을 저장하기 위한 가변 공간이다. (사용 예시 va_list arg_ptr)

 

#include <stdarg.h>

var_type va_arg(va_list arg_ptr, var_type);
void va_copy(va_list dest, va_list src);
void va_end(va_list arg_ptr);
void va_start(va_list arg_ptr, variable_name);

 

va_start는 va_list를 초기화하는 역할이다.

va_list를 초기화할 때 

va_list의 주소 값에 고정인수(2번째 인자)크기를 더한 위치로 arg_ptr을 초기화하기 때문에 arg_ptr은 물론이고 고정인수 또한 필요하다.

 

va_arg는 arg_ptr이 위치한 부분에서 var_type의 데이터를 읽어서 반환하는 역할을 한다.

그리고 var_type의 크기를 사용하여 list의 다음 인수를 가리키도록 arg_ptr을 증가시켜 다음 인수가 시작되는 위치를 결정한다.

데이터를 반환하는 데에서 연산이 끝나는 게 아니라 타입길이만큼 arg_ptr을 옮기기 때문에 계속해서 다음 값을 출력할 수 있다.

va_arg를 원하는 횟수만큼 사용하여 list에서 인수를 반환할 수 있다.

c에서는 char type도 int로 받아야한다!

 

va_end는 모든 작업이 끝난 후 포인터를 NULL로 초기화한다.

va_copy는 현재의 list의 복사본을 만드는 함수이다. src는 va_start로 이미 초기화된 상태여야 하며, va_end로 닫아버린 list이면 안된다.

 

 

 

서식문자

printf 함수의 첫번째 파라미터에 들어가는 글자들. (예 : %d, %f %e %c %s)

데이터의 출력 타입을 사용자가 지정할 때 사용된다.

이 프로젝트에서 쓰일 서식문자들은 다음과 같다.

%c : 단일 문자(character) 한개를 출력할 때 쓰인다.

%s : 문자열(string)을 출력할 때 쓰인다.

%p: void * 형식의 포인터 인자를 16진수(0x16진수)의 형태로 출력한다.

%d: decimal(base 10), 10진수 숫자를 출력한다.

%i : 10진수 정수(integer)를 출력한다.

%u : 부호 없는 10진수(unsigned decimal)를 출력한다.

%x : 16진수로 출력하되, 10 이상의 숫자를 표현할 때 소문자(lowercase)를 사용하여 출력한다.

%X : 16진수로 출력하되, 10 이상의 숫자를 표현할 때 대문자(uppercase)를 사용하여 출력한다.

%% : %를 출력하고 싶은 경우에, 이와 같이 퍼센트를 두번 써주면 원하는 대로 출력이 된다.

 

 

 

각 함수에 대한 설명

ft_check : "cspdiuxX%" 문자열(param)과 함수의 파라미터로 받는 format의 값을 비교하여 일치하면 1, 일치하는 게 없으면 0을 리턴하는 함수.

ft_task : format에 맞춰 함수를 수행한다. len 배열을 반환한다.

ft_putstr : 피씬 때부터 짜왔던 함수. 문자열을 write()를 이용해 표준출력하는 함수.

ft_putchar : 피씬 때부터 짜왔던 함수. 문자 하나를 write()를 이용해 표준출력하는 함수.

ft_putnbr : 피씬 때부터 짜왔던 함수. 정수를 write()를 이용해 표준출력하는 함수.

ft_hexdecimal : 16진수를 소문자로 출력하는 함수

ft_hedecimal : 16진수를 대문자로 출력하는 함수

ft_unsigned : unsigned int를 출력하는 함수

ft_pointerhexdecimal : 포인터 값중 16진수를 출력하는 함수 (0x 뒤에 붙는 숫자)

ft_pointer : 포인터를 출력하는 함수. 포인터 형식과 똑같이 출력되도록 가장 앞에 "0x"를 붙이고, pointerhexdecimal을 호출하는 역할을 한다.