Переключите регистр 0: введите 0 и введите букву - PullRequest
1 голос
/ 06 ноября 2019
int DisplaySchedule()
{
    int nDisplaySchedule_Choice;

    system("cls");
    printf("----- DISPLAY SCHEDULE -----\n");
    printf("Pick departure station\n\t");
    printf("[1] San Pedro\n\t");
    printf("[2] Santa Rosa\n\t");
    printf("[3] Calamba\n\n\t");
    printf("[9] Go Back\n\t");
    printf("[0] Exit\n\n");
    printf("Choice: ");
    scanf("%d", &nDisplaySchedule_Choice);
    printf("\n");

    switch (nDisplaySchedule_Choice) {
        case 1: SanPedro(); break;
        case 2: SantaRosa(); break;
        case 3: Calamba(); break;
        case 9: OpeningScreen(); break;
        case 0: printf("Summary()"); break;
        default:
            printf("ERROR. INPUT A VALID RESPONSE.\n\n");
            DisplaySchedule();
            break;
    }
    return;
}

У меня есть этот код, в котором при вводе письма вместо печати сообщения об ошибке вместо него выводится case 0:. Могу ли я сделать так, чтобы case 0: функционировал только тогда и только тогда, когда я введу «0» в операторе scanf?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

У вас есть неопределенное поведение здесь.

scanf, при сканировании на int (%d) происходит сбой, потому что вы вводите символ - из-за сбой сопоставления . Таким образом, вообще ничего не читая в nDisplaySchedule_Choice.

Поскольку nDisplaySchedule_Choice неинициализирован с самого начала, просто получается, что 0 и, следовательно, переходит к case 0.

. Решением является проверка возвращаемого значения scanf перед использованием nDisplaySchedule_Choice. scanf возвращает количество успешно отсканированных элементов.

2 голосов
/ 06 ноября 2019

Если scanf не может прочитать значение (например, потому что вы сказали ему прочитать int и дали ему письмо), оно не изменит вашу переменную. Так что nDisplaySchedule_Choice не изменится так, как вы можете проверить в switch. По крайней мере, если вы не инициализируете его - вы можете установить для него значение, которое не охватывается вашим switch, и если оно не изменилось, вы знаете, что scanf не удалось прочитать значение.

Или вы можете проверить возвращаемое значение scanf, чтобы увидеть, удалось ли ему прочитать значение:

int result = scanf("%d", &nDisplaySchedule_Choice);
if (result == 0) {
    int c;
    while ((c = getchar()) != '\n' && c != EOF); // flush the invalid input
    printf("ERROR. INPUT A VALID RESPONSE.\n\n");
    DisplaySchedule();
}
else switch ...
...