Задачка на функция с переменным числом разнотипных параметров

Добрый день товарищи форумчане!))

Задание: "Разработать функцию с переменным количеством параметров, которая для каждого своего числового параметра, задающего порядковый номер дня года, определяет и выводит на экран соответствующую дату: <День> < Наименование месяца>, например: 47 день – 16 февраля. Параметрами функции (возможно, кроме первого) являются числа, задающие номера дней в текущем году. Для каждого из дней нужно указать соответствующую дату или указать ошибку (целесообразно воспользоваться вспомогательной функцией для формирования дат). Результат выводится в форме таблицы."

Нужно было сделать 2 варианта программы. В первом все параметры одного типа, а в другом разнотипные. Первый вариант работает просто чудесно, но со вторым беда. Подскажите что исправить или переделать в коде.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdarg.h>

void put_data(int);
void get_data(const char* types, ...);

int main(void) {

    // вызываем функцию
    printf("  -------------\n");
    get_data("%d", 47, 116, 200, 89, 26);    // с 5'ю аргументами
    return 0;
}

// -------------------------------------------------------------
void get_data(const char* types, ...) {

    double d_numb;
    int i_numb;
    long l_numb;

    va_list day;
    va_start(day, types);

    for (const char* ptr = types; *ptr; ptr++) {
        if (*ptr != '%')
        {
            printf("%c", *ptr);
            continue;
        }
        switch (*++ptr) {
        case 'i':
            for (int i = 0; i < *ptr; i++) {
                i_numb = va_arg(day, int);
                put_data(i_numb);
            }
            break;
        case 'd':
            for (int i = 0; i < *ptr; i++) {
                d_numb = va_arg(day, double);
                put_data(d_numb);
            }
            break;
        case 'l':
            for (int i = 0; i < *ptr; i++) {
                l_numb = va_arg(day, long);
                put_data(l_numb);
            }
            break;
        }
    }
    va_end(day);
}

// -------------------------------------------------------------
void put_data(int day) {
    int max_day = 365;
    if (day < 1 || day > max_day) {
        puts("Wrong day number");
        return;
    }
    int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    char months[12][4] = { "jan", "feb", "mar", "apr", "may", "jun",
        "jul", "aug", "sep", "oct", "nov", "dec" };

    int month = 0, s = 0;
    while (s + days[month] < day)
        s += days[month++];
    int d = day - s;
    printf(" |date: %02d %s |\n", d, months[month]);
    printf("  -------------\n");
}
// ------------------------------------------------------------

Ответы (0 шт):