Язык Си. Тема: структуры данных

Необходимо произвести ввод и вывод массива структур на экран. Структура «Клиент банка» включает в себя: Фамилия И.О. самого клиента, номер счёта, сумма на счёте, дата последнего изменения. Необходима помощь с доработкой ввода, чтобы он стал более фиксированным (например, я могу ввести дату 25.01.2021 или 25 января 2021-го года, а мне нужно вводить именно первым вариантом (25.01.2021) - как это сделать?), та же ситуация с вводом ФИО - написал, например, фамилию, имя, потом отчество и после него пару цифр - и программа одобрила. Помогите, пожалуйста, разобраться в коде. Ну, с датой я думал, что можно в структуры 3 int-a ввести (day, month и year соответственно), а потом вводить их с помощью цикла while (scanf_s("%lf", &a[i].process.day) == 0 || a[i].process.day < 0 || prov(a[i].process.day) == 1), а в printf-e выводить дату через точки, а на ввод ФИО надо писать какое-то ограничивающее условие. Первое что пришло в голову, это ограничить, опять же: while (a[i].process.master>='a' && a[i].process.master <='Z') и так же для русского алфавита - только как потом возвразать пользователя на повторный ввод сначала?

Непосредственно сам код:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
struct rab {
    char* master;
    double cost;
};
struct auto1 {
    char* number;
    double km;
    rab process;
};
int prov(double n) {
    char* s = (char*)malloc(50 * sizeof(char));
    fgets(s, 255, stdin);
    if (s[0] == '\n')
        return 0;
    else return 1;
}
int proverka_indiv(auto1* a, int n, char* num) {
    int k = 0;
    for (int i = 0; i < n; i++)
        if (strcmp(a[i].number, num) == 0)
            k++;
    if (k == 0)
        return 0;
    else return 1;
}
void delet_n(char*& a) {
    int i = 0;
    while (a[i] != '\n')
        i++;
    a[i] = '\0';
}
void input(auto1*& a, int& n) {
    double w;
    int q, fl = 0, e;
    printf_s("Введите количество клиентов в банке: ");
    e = n;
    do {
        while (scanf_s("%lf", &w) == 0 || w < 0 || prov(w) == 1) {
            printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
            rewind(stdin);
        }
        q = w;
        if (w - q != 0) {
            printf_s("Вы ввели дробное число, а надо целое. Повторите.\n");
            continue;
        }
        if (q == 0)
            return;
        a = (auto1*)realloc(a, (n + q) * sizeof(auto1));
        fl = 1;
        for (int i = n; i < q + n; i++) {
            a[i].process.master = (char*)malloc(50 * sizeof(char));
            a[i].number = (char*)malloc(50 * sizeof(char));
            double e, pl = 0;
            char* poiu = (char*)malloc(50 * sizeof(char));
            printf_s("\n  Дата последнего изменения: ");
            rewind(stdin);
            int k = 0;
            do {
                fgets(poiu, 255, stdin);
                delet_n(poiu);
                k = 1;
            } while (proverka_indiv(a, i + 1, poiu) > 0);
            a[i].number = poiu;
            printf_s("  номер счёта: ");
            while (scanf_s("%lf", &a[i].km) == 0 || a[i].km < 0 || prov(a[i].km) == 1) {
                printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
                rewind(stdin);
            }
            printf_s("  ФИО клиента: ");
            rewind(stdin);
            fgets(a[i].process.master, 255, stdin);
            delet_n(a[i].process.master);
            printf_s("  сумма на счёте($): ");
            while (scanf_s("%lf", &a[i].process.cost) == 0 || a[i].process.cost < 0 || prov(a[i].process.cost) == 1) {
                printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
                rewind(stdin);
            }
        }
    } while (fl == 0);
    n += q;
}
void output(auto1* a, int n) {
    printf_s("Дата последнего изменения\t\t\t\tномер счёта\t\t\t\tклиент\t\t\t\tсумма на счёте\n");
    for (int i = 0; i < n; i++)
        printf_s("%-31s %-31.2lf %-31s %-31.2lf\n", a[i].number, a[i].km, a[i].process.master, a[i].process.cost);

    //printf_s("%10s\t\t%15s\t\t%7.2lf\t%15s\t\t%20s\t\t%7.2lf\n", a[i].number, a[i].mark, a[i].km, a[i].process.master, a[i].process.work, a[i].process.cost);

}

int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    struct auto1* cs = (auto1*)malloc(sizeof(auto1));
    int buf = 1, flag = 0, n = 0, a;
    double w;
    do {
        rewind(stdin);
        printf_s("что вы хотите сделать?(варианты ответа 1-9)\n  1.Ввод\n  2.Вывод на экран\n 3.Завершить работу\nВаш Ответ: ");
        while (scanf_s("%lf", &w) == 0 || w < 0 || w > 8 || prov(w) == 1) {
            printf_s("Вы ввели не то, что надо или данного пункта нет в списке задач. Повторите. Ваш ответ: ");
            rewind(stdin);
        }
        a = w;
        if (w - a != 0) {
            printf_s("Вы ввели дробное число, а надо целое. Повторить.\n");
            continue;
        }
        system("CLS");
        switch (a) {
        case 1: input(cs, n); break;
        case 2:if (n != 0)output(cs, n); else printf_s("Вы ещё не ввели данные про авто."); break;
        case 3: buf = 0; break;
        }
        if (buf != 0) {
            double e;
            printf_s("Вы хотите вернуться в меню?\n  1.да\n  2.нет(выйти из программы)\nВаш ответ: ");
            while (scanf_s("%lf", &e) == 0 || (e != 2 && e != 1) || prov(e) == 1) {
                printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
                rewind(stdin);
            }
            if (e == 2)
                buf = 0;
            rewind(stdin);
        }
        system("CLS");
    } while (buf == 1);
}

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