가변 인자란?
함수의 매개변수 개수가 고정적이지 않고, 변할 수 있다는 의미입니다. 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');
출력결과
반응형
'42Seoul > c언어' 카테고리의 다른 글
C언어 - 완전 탐색(Brute-force) 알고리즘으로 map에 있는 구멍 찾기 (0) | 2020.10.28 |
---|---|
c언어 - printf()의 서식지정자(format specifier)와 플래그 (0) | 2020.10.22 |