66.5 연습문제: 자료형이 다른 가변 인자의 합 구하기

getSum 함수에는 10진수로 된 문자열과 정수가 들어갑니다. 다음 소스 코드를 완성하여 getSum함수에 지정된 값의 합이 출력되게 만드세요.

자료형 약칭

  • char *: s
  • int: i

practice_variable_argument_multiple_types.c

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

long long getSum(char *types, ...)
{
    va_list ap;
    int i = 0;
    long long result = 0;

    va_start(ap, types);
    while (types[i] != '\0')
    {
        _________________________
        {
        case 's':
            _________________________________
            break;
        case 'i':
            _________________________________
            break;
        default:
            break;
        }
        i++;
    }
    va_end(ap);

    return result;
}

int main()
{
    printf("%lld\n", getSum("siis", "12", 30000, 500000, "300"));
    printf("%lld\n", getSum("ssi", "150", "150", 100));

    return 0;
}

실행 결과

530312
400

정답

 switch (types[i])
 result += atoi(va_arg(ap, char *));
 result += va_arg(ap, int);

해설

반복문에서 자료형 약칭 문자열 types의 문자 개수만큼 반복하고 있는데 types에 들어있는 문자를 하나하나 처리하려면 switch (types[i])와 같이 switch 분기문을 지정해주면 됩니다.

자료형이 정수일 때는 값을 result 변수에 계속 더해주면 되지만 문자열일 때는 atoi(va_arg(ap, char *));처럼 atoi 함수를 사용하여 문자열을 정수로 변환한 뒤 result 변수에 계속 더해주면 됩니다.