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