Wspólne makro do odczytu danych wejściowych i sprawdzania ich ważności

Widziałem na Stack Overflow, że wiele podobnych pytań powtarza się i są one związane z odczytaniem jednego elementu danych wejściowychstdin i sprawdź jego ważność.

Dane mogą być liczbą całkowitą"%d", podwójnie"%f", strunowy"%s", unsigned int"%u"...

I chcę opracować wspólne makro, które mogłoby być użyte dlawiększość tych pytań.

Przykład 1 pytań

OP mógłby zapytać:

zeskanuj dane wejściowedane powinny być liczbami całkowitymi11a, aaa, aa44, ... wejścia nie są dozwolone. Tylko liczba całkowita, a po niej biały znak (patrzisspace ()) jest dozwolonew pytaniu mogą występować inne warunki, takie jak: wejściowa liczba całkowita powinna być>3 i<15

Przykład 2 pytań

OP mógłby zapytać:

zeskanuj dane wejściowedane powinny się podwoić11.2a, aaa, aa44.3, ... wejścia nie są dozwolone. Tylko podwójne, a następnie białe znaki (patrzisspace ()) jest dozwolonew pytaniu mogą występować inne warunki: podwójne dane wejściowe powinny być>3.2 i<15.0

Czy możliwe jest stworzenie wspólnego makra

#define SCAN_ONEENTRY_WITHCHECK(FORM,X,COND)
// FORM: format of the input data like "%d", "%lf", "%s"
// X: address where to store the input data
// COND: condition to add in the check of the input data

....

// example of calling the macro in the main()

int a;
SCAN_ONEENTRY_WITHCHECK("%d", &a,(a>3 && a<15))

Makro powinno skanować dane i JEŚLI jedno z poniższych kryteriów nie jest prawdziwe, wydrukuj wiadomość do użytkownika, prosząc go o ponowne wprowadzenie. i powtarzaj to, aż użytkownik wprowadzi poprawne dane?

Kryteria:

typ danych wejściowych powinien być taki sam, jak wskazany przez formatpo danych wejściowych powinna następować biała spacja wskazana wisspace ()dane wejściowe powinny być poprawneCOND

questionAnswers(1)

yourAnswerToTheQuestion