본문 바로가기
Programming/42Seoul

42 ft_printf 이해 및 사전 개념정리

by 말린밴댕이_공부 2022. 11. 11.
반응형

우리가 흔히 보이는 printf함수는 <stdio.h>에서 정의가 되어있으며

printf(const char *restrict format , …) 로 정의가 되어있다.

 

첫번째 매개변수로 문자열(format)이 입력되고, 그 이후는 가변인자로 n개의 매개 변수를 받는다.

format은 %[parameter][flags][width][.precision][length] type 형식을 가지며 해석하면

%[n][flag][출력 너비][출력되는 값(숫자)의 정확도][데이터 타입 범위] type(서식문자)이다.

 

가변인자

va_list → 가변 안수들에 대한 정보를 홀드하기 위한 타입

va_start → 두개의 인자를 받음, va_list인스턴스와 고정인수를 받음

va_arg → ap포인터가 위치한 부분의 데이터를 읽어 반환함

va_end → 아스키코드 0은 null을 의미하는데 va_list타입을 null로 초기화한다는 소리

 

printf의 두번째 인자를 우리는 가변 인자 혹은 가변 파라미터라고 부른다.

 

#include <stdarg.h>

이 헤더 파일에는 기본적으로 가변인자 함수를 정의가 되어있다.

여러개의 가변인자 함수를 받을때는 ‘…’을 사용한다.

 

va_start(ap, num_args) → ap가 첫 번째 가변인수를 가리킬수 있도록 초기화

va_end(ap) → 가변 인자 사용 끝으로 지칭

 

va _list

길이가 변할 수 있는 인수들을 저장하려면 가변의 저장공간이 필요하다. va_list라는 타입이 이 가변공간이 될건데, 예를들어 va_list ap → 이 코 드는 여러 인수를 저장하는데 쓰일 타입을 선언하는 코드

즉, 가변 인수들에 대한 정보를 홀드하기 위한 타입

 

va_start

두개의 인자를 받는다, va_list 인스턴스(ap) 그리고 고정인수를 받는다.

역할이 list를 초기화하는거기 때문에 list타입이 선언되어 이전에 인스턴스가 있어햐한다.

첫 번째 가변인자 주소를 알려면 고정주소가 필요하기 때문에 va_list 주소 값에다가 고정인수 크기를 더한 위치로 ap를 초기화 하기 때문인다.

 

va_arg

ap포인터가 위치한 부분의 데이터를 읽어 반환을 한다.

그 다음에 ap 포인터를 타입 길이만큼 뒤로 옮기기 때문에 그 다음 값이 이어서 출력 될 수 있음

ap += _INTSIZEOF(t) 부분에 의해서 ap 주소값은 t사이즈만큼 증가하게 되는거이다.

하지만 ap에 대입하지는 않고 사이즈는 증가한 ㅟㅇ치에 그대로 있지만 실제 우리가 출력하는 부분은 기존 부분이 되는것

 

va_end

va_list 타입을 NULL로 초기화해서 끝내버린다.

 

 

int	ft_printf(const char *format, ...)
{
	int		tmp;
	va_list	ap;

	va_start(ap, format);
	tmp = start_printf(&ap, format);
	va_end(ap);
	return (tmp);
}

받은 문자열을 파싱하여 출력하고 출력된 문자열의 수를 반환하는 식으로 작성했다.

 

이어서 나중에 정리해야겠다.

반응형

댓글