우리가 흔히 보이는 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);
}
받은 문자열을 파싱하여 출력하고 출력된 문자열의 수를 반환하는 식으로 작성했다.
이어서 나중에 정리해야겠다.
'Programming > 42Seoul' 카테고리의 다른 글
[42seoul Philosopher] 42서울 philosopher과제 개념 정리 (0) | 2023.07.06 |
---|---|
[42seoul, so_long] 42서울 so_long 과제 개념 정리 (0) | 2023.03.25 |
[42seoul, pushswap] 42서울 푸시스왑 과제 개념 정리 (0) | 2023.03.25 |
[42seoul, minitalk] 42서울 미니톡 과제 개념 정리 (0) | 2023.03.25 |
댓글