Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 가변 인자(Variadic) 함수로 합계, 최댓값, 최솟값 구하기

인자의 개수가 정해져 있지 않고, 호출할 때마다 여러 개의 인자를 받을 수 있는 함수를 만들고 싶은 경우가 있습니다. 예를 들어 sum(), max(), min() 세 가지 함수를 만들어 각각 주어진 숫자들의 합계, 최댓값, 최솟값을 계산한다고 생각해 봅시다.

이런 종류의 함수를 가변 인자 함수(variadic function)라고 부르며, 정의하려면 함수 매개변수에 줄임표(...) 세 개의 점을 사용해야 합니다. 또한 이를 사용하려면 stdarg.h 헤더 파일을 포함시켜야 합니다.

각 함수는 첫 번째 인자로 나머지 인자의 개수(count)를 받습니다. 가변 인자에 접근하기 위해 알아두어야 할 네 가지 요소는 다음과 같습니다.

  • va_list : 전달된 모든 가변 인자를 저장하는 자료형입니다.
  • va_start : 가변 인자 목록에 대한 접근을 시작합니다.
  • va_arg : 지정한 타입의 다음 인자를 하나씩 가져옵니다.
  • va_end : 가변 인자 목록에 대한 접근을 종료합니다.

호출 예시

함수를 다음과 같이 호출했다고 가정해 보겠습니다.

  • sum(5, 5, 2, 8, 9, 3)
  • max(3, 5, 9, 2)
  • min(6, 8, 5, 2, 6, 7, 9)

그러면 출력 결과는 각각 27(다섯 개 숫자의 합), 9(세 개 숫자 중 최댓값), 2(여섯 개 숫자 중 최솟값)가 됩니다.

풀이 접근 방법

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  1. sum() 함수 정의 : 첫 번째 매개변수 cnt와 가변 인자를 받습니다.
    • va_list ap 선언
    • va_start(ap, cnt)로 ap 초기화
    • n := 0으로 초기화
    • i := 0부터 i < cnt까지 반복하며 n에 va_arg(ap, int)로 가져온 값을 더함
    • va_end(ap)로 접근 종료 후 n 반환
  2. min() 함수 정의 : 마찬가지로 cnt와 가변 인자를 받습니다.
    • va_list ap 선언 및 va_start(ap, cnt)로 초기화
    • minimum := 99999로 초기화
    • 반복문 안에서 current := va_arg(ap, int)로 다음 인자를 가져오고, current < minimum이면 minimum := current로 갱신
    • va_end(ap)로 접근 종료 후 minimum 반환
  3. max() 함수 정의 : 동일한 방식으로 cnt와 가변 인자를 받습니다.
    • va_list ap 선언 및 va_start(ap, cnt)로 초기화
    • maximum := 0으로 초기화
    • 반복문 안에서 current := va_arg(ap, int)로 다음 인자를 가져오고, current > maximum이면 maximum := current로 갱신
    • va_end(ap)로 접근 종료 후 maximum 반환

예제 코드

다음 구현 예제를 통해 더 잘 이해해 보겠습니다.

#include <stdio.h>
#include <stdarg.h>
int sum (int cnt,...) {
    va_list ap;
    int i, n;
    va_start(ap, cnt);
    n = 0;
    for (i=0;i<cnt;i++){
        n += va_arg(ap, int);
    }
    va_end(ap);
    return n;
}
int min(int cnt,...) {
    va_list ap;
    int i, current, minimum;
    va_start(ap, cnt);
    minimum = 99999;
    for (i=0;i<cnt;i++){
        current = va_arg(ap, int);
        if (current < minimum)
            minimum = current;
    }
    va_end(ap);
    return minimum;
}
int max(int cnt,...) {
    va_list ap;
    int i, current, maximum;
    va_start(ap, cnt);
    maximum = 0;
    for (i=0;i<cnt;i++){
        current = va_arg(ap, int);
        if (current > maximum)
            maximum = current;
    }
    va_end(ap);
    return maximum;
}
int main(){
    printf("%d\n",sum(5, 5, 2, 8, 9, 3));
    printf("%d\n",max(3, 5, 9, 2));
    printf("%d\n",min(6, 8, 5, 2, 6, 7, 9));
}

입력

sum(5, 5, 2, 8, 9, 3)
max(3, 5, 9, 2)
min(6, 8, 5, 2, 6, 7, 9)

출력

27
9
2

이처럼 C 언어에서는 stdarg.h의 매크로들을 활용하면 인자 개수가 유동적인 함수를 손쉽게 구현할 수 있습니다. 다만 가변 인자 함수는 타입 검사가 이루어지지 않으므로, 인자의 개수와 타입을 정확히 전달하는 것이 중요합니다.