c언어 - 가변인자란? 가변인자로 간단한 printf() 구현하기
42Seoul/c언어

c언어 - 가변인자란? 가변인자로 간단한 printf() 구현하기

가변 인자란?

함수의 매개변수 개수가 고정적이지 않고, 변할 수 있다는 의미입니다. printf와 같이 매개변수의 개수가 정해지지 않은 함수를 구현하기 위해 가변 인자를 사용합니다.

반환형 함수명(고정 매개변수, ...) { }

여기서 두 번째 매개변수인 '...'가 가변 인자이며, 가변 인자를 사용하기 위해서는 고정 매개변수가 1개 이상 필요합니다.

 

 

가변 인자 사용하기

'...'으로 받아온 가변 인자를 사용하기 위해서는 stdarg.h 헤더를 포함해야 합니다.

#include <stdarg.h>

이 헤더에는 가변 인자를 처리하기 위한 매크로가 포함되어있습니다.

va_list 가변인자 포인터. 각 가변인자의 메모리 주소를 가짐 va_list 변수명
va_arg 가변인자 포인터로부터 값을 받아오고, 다음 가변인자 주소로 이동 va_arg(가변인자 포인터, 자료형)
va_start 가변인자 포인터에 첫번째 가변인자의 주소를 전달 va_start(가변인자 포인터, 마지막 고정매개변수)
va_end 가변인자 포인터를 NULL로 초기화 va_end(가변인자 포인터)

 

 

printf() 구현 예제

다음은 %c를 인식하여, char형 문자를 출력할 수 있는 printf의 예제입니다.

이번 예제에서는 따로 지정되지 않은 %형식지정자의 예외처리는 하지 않았습니다.

#include <unistd.h>
#include <stdarg.h>

int ft_printf(const char *format, ...)
{
	int len;
	char var;
	va_list ap;
    
	len = 0;
	va_start(ap, format);
	while (format && *format)
	{
		/* 여기서 %cduix등의 형식지정자를 처리합니다 */
		if (*format == '%')
		{
			format++;
			/* 이번 예제에서는 %c만 출력해 봅시다  */
			if (*format == 'c')
			{
				var = va_arg(ap, int);
				write(1, &var, 1);
				len++;
			}
			format++;
		}
 		else
		{
			write(1, format, 1);
			format++;
			len++;
		}
	}
	va_end(ap);
	return (len);
}
ft_printf("print char test: %c\n", 'c');

 

출력결과