0

Я хочу написать программу которая при вводе 1 - 4 выполняет некоторые действия, при вводе числа 5 завершает работу, а при любом другом вводе выводит приглашение и запрашивает новый ввод. Описанная ниже программа работает, но не так. При вводе значения не типа int она просто прекращает работу

#include <stdio.h>

int main(void) {
    int num = 0;
    printf("Enter num:");
    while (scanf("%d", &num) == 1) {
        switch (num) {
            case 1  : ; break;
            case 2  : ; break;
            case 3  : ; break;
            case 4  : ; break;
            case 5  : goto quit;
            default : goto step;
        }
        ; // некоторые операторы
        step: printf("Enter num:");
    }
    quit: return 0;
}

Я пытался исправить это вот так:

#include <stdio.h>

int main(void) {
    int num = 0;
    new: printf("Enter num:");
    while (scanf("%d", &num) == 1) {
        switch (num) {
            case 1  : ; break;
            case 2  : ; break;
            case 3  : ; break;
            case 4  : ; break;
            case 5  : goto quit;
            default : goto step;
        }
        ; // некоторые операторы
        step: printf("Enter num:");
    }
    goto new;
    quit: return 0;
}

Но так ещё хуже, происходит зацикливание. Функция scanf вновь и вновь пытается прочитать одно и то же значение не являющееся значением типа int. Как заставить её отбросить ошибочный ввод и читать следующий?

  • 1
    Намек: https://ru.stackoverflow.com/questions/834447/%D0%A1%D0%B1%D1%80%D0%BE%D1%81-%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0-%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0-%D1%87%D0%B8%D1%82%D0%B0%D0%B5%D1%82-%D0%BB%D0%B8%D1%88%D0%BD%D1%8E%D1%8E-%D0%BF%D1%83%D1%81%D1%82%D1%83%D1%8E-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D1%83 – Harry Oct 24 '19 at 15:25
  • 1
    "При вводе значения не типа int" scanf вернет 0 и цикл сразу завершится. Неудивительно, что программа прекратит работу. Зачем вам вообще в вашей программе понадобился цикл while (scanf("%d", &num) == 1)? Какую роль он играет? Все ваши манипуляции с goto - это фактически попытки "победить" этот цикл. – AnT stands with Russia Oct 24 '19 at 16:27
  • Это цикл для многократного ввода данных, часто применяется в книге по которой я учу язык – Виктор Oct 24 '19 at 16:54
  • Намёк этот про то что следует пропустить все символы до первого цифрового? Но это оставляет возможность для ввода действительного числа – Виктор Oct 24 '19 at 16:56
  • 1
    В случае ошибки ввода проверьте stdin на EOF и если это не так, то читайте getchar()-ом до \n (очищаете ввод), а затем снова выходите на scanf – avp Oct 24 '19 at 21:04

1 Answers1

1
#include <stdio.h>

int main(void) {
    int num = 0, err, c;
    while (1) {
        printf("Enter num:");
        err = scanf("%d", &num);
        if (err == 1) {
            switch (num) {
                case 1  : printf("-1\n"); break;
                case 2  : printf("-2\n"); break;
                case 3  : printf("-3\n"); break;
                case 4  : printf("-4\n"); break;
                case 5  : printf("-Выход\n"); goto quit;
                default : printf("-Недопустимое значение : %d\n", num); continue;
            }
        } else if (err == 0) {
            printf("Ошибочный ввод\n");
            while ((c = getchar()) != '\n' && c != EOF) { };
            continue;
        } else if (err == EOF) {
            goto quit;
        } else {
            printf("Вообще что-то непонятное...\n");
        }
    }
    quit: return 0;
}
Sergey
  • 13,474