printf() 함수의 경우 내가 원하는 만큼 인자를 넘길 수있다. 예를 들면
printf("%d", a); // 인자 2개
printf("%d %d", a, b); // 인자 3개
이게 가능한 이유는 printf()가 매개변수의 개수가 정해지지 않은 가변인자 함수이기 때문이다.
가변인자 함수로 인자의 개수와 상관없이 정수형 인자를 여러개 받아서 인자 모두를 더한 값을 반환하는 함수를 만들어보도록 하겠다.
#include<stdio.h>
// stdarg.h 포함. va_list, va_start, va_arg, va_end가 정의된 헤더 파일
#include<stdarg.h>
int sum(int num_args, ...) { // 가변 인자의 개수를 받음, ...로 가변 인자 설정
va_list ap; // 가변 인자 목록 포인터
va_start(ap, num_args); // 가변 인자 목록 포인터 설정
int arg = 0;
int sum = 0;
for (int i = 0; i < num_args; i++) { // 가변 인자 개수만큼 반복
arg = va_arg(ap, int); // int 크기만큼 가변 인자 목록 포인터에서 값을 가져옴 동시에 ap를 int 크기만큼 순방향으로 이동
sum += arg;
}
va_end(ap); // 가변 인자 목록 포인터를 NULL로 초기화
return sum;
}
int main() {
// 맨 처음에 인수 개수를 넣어준 뒤 인수 개수에 맞게 인수를 콤마로 구분하여 넣어줌
printf("%d\n", sum(1, 10));
printf("%d\n", sum(2, 10, 20));
printf("%d\n", sum(3, 15, 15, 15));
printf("%d\n", sum(4, 10, 10, 20, 20));
printf("%d\n", sum(5, 1, 2, 3, 4, 5));
return 0;
}
실행 결과
참고 : https://dojang.io/
가변인자 출력함수 만들기
void printMsg(char *format,...)
{
#ifdef _DEBUG
char str[80];
va_list args;
va_start(args, format);
vsprintf(str, format,args);
HAL_UART_Transmit(&huart3,(uint8_t *)str, strlen(str),HAL_MAX_DELAY);
va_end(args);
#endif
}
1. 가변 인수 목록을 가리킬 va_list 타입의 변수 args를 선언한다.
2. va_start로 va_list 변수가 목록 중 첫번째 가변인수를 가르키도록 초기화한다.
두번째 파라미터로 마지막 고정 매개변수를 넘기면 그 다음 번지로 가변인수 목록 시작 위치를 지정하고, 이후 va_arg를 사용하면 두번째 파라미터인 인수 타입에 따라 순서대로 가변인수를 읽을 수 있다.
void va_start(va_list ap, last_fixed_param);
3. vsprintf 함수를 사용하여 format에 담긴 정보를 기반으로 가변인수를 처리하여 문자열을 생성하여 str버퍼에 저장한다.
4. 저장된 문자열을 출력함수에 전달해 출력한다.
5. va_end로 가변인수 리스트를 정리하고 마무리한다.
'프로그래밍 > C' 카테고리의 다른 글
C, Linux ] ls 명령어 구현 (0) | 2022.08.17 |
---|---|
C, Linux ] main 함수의 매개변수 사용해서 파일 입출력 하기 (0) | 2022.08.17 |
[ Visual Studio ] CRT 라이브러리로 메모리 누수 탐지하기 (0) | 2022.05.02 |
[ C언어 ] realloc은 얼마나 자주 메모리 주소를 옮길까? (0) | 2022.05.02 |
[ C언어 ] scanf의 리턴값 (0) | 2022.04.27 |