Как использовать scanf для отклонения ввода, который смешивает разделители в дате (напр. 15 / 01-2015)? - PullRequest
1 голос
/ 25 марта 2019

Мне нужно проверить, использует ли пользовательский ввод правильные разделители. Однако код, который я сейчас имею, по-прежнему допускает, например, «15-10 / 1999», чего не должно быть. Я не совсем уверен, как именно изменить условие while, чтобы запретить это.

char delim1, delim2;
do { 
    printf("Please enter date (dd-mm-yy or dd/mm/yy):");   
    scanf("%d%c%d%c%d", &day1, &delim1,  &mon1, &delim2, &year1);
} while (delim1 != '-' && delim1 != '/' && delim2 != '-' && delim2 != '/');

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Самый простой способ - сопоставить разделитель в строке fmt и ПРОВЕРИТЬ ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ scanf !!!!

printf("Please enter date (dd-mm-yy or dd/mm/yy):");
while ((cnt == scanf("%u/%u/%u", &day, &mon1, &year1)) != 3) {
    if (cnt == 1 && scanf("-%u-%u", &mon1, &year1) == 2) break;
    if (scanf("%*[^\n]") == EOF) {   // discard the rest of the line
        exit(1);  // alternately clearerr(stdin); if you want to try
        // again despite the error or eof
    }
    printf("Invalid input, please enter date (dd-mm-yy or dd/mm/yy):");
}
1 голос
/ 25 марта 2019

Вы можете использовать:

while (delim1 != delim2 || (delim1 != '-' && delim1 != '/'));

Это гарантирует, что разделители будут равны после того, как условие while будет выполнено, и что оно будет либо '-', либо '/' .

0 голосов
/ 25 марта 2019

Непроверенные:

char delim1, delim2;
do { 
    printf("Please enter date (dd-mm-yy or dd/mm/yy):");   
    scanf("%d%c%d%c%d", &day1, &delim1,  &mon1, &delim2, &year1);
} while (!(delim1 == '-' && delim2 == '-') || !(delim2 == '&' && delim2 == '&'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...