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을 호출하는 역할을 한다.
'42seoul' 카테고리의 다른 글
Philosophers : process synchronization (0) | 2022.05.03 |
---|---|
Push Swap : 가장 작은 인자 정렬 프로그램을 계산하기 (0) | 2022.04.02 |
So Long : miniLibX로 만드는 간단한 2D 게임 (0) | 2022.04.02 |
Minitalk : 서버와 클라이언트 간 문자열 교환 프로그램(using SIGNAL) (0) | 2022.04.02 |
GNL (0) | 2022.04.02 |