0

При вводе какого-либо знака, которое не является числом, scanf_s отказывается вызываться на следующем шаге, причина чего мне непонятна.

 for (int i = 0; i < N; i++) {
    int answer;
    int flag;
    do {
        flag = 1;
        printf("Выберите способ создания квадратов: \n");
        printf("1. Создание квадрата по координатам центра и длине.\n");
        printf("2. Создание квадрата по координатам центра и координатам точки, лежащей на границе этого квадрата.\n");
        printf("3. Создание квадрата(квадратной оболочки) для двух других квадратов. (Как минимум нужно иметь 2 квадрата)\n");
        printf("Ваш ответ: ");
        scanf_s("%d", &answer);  // СТРОКА, ГДЕ SCANF_S НЕ РАБОТАЕТ, ЕСЛИ БЫЛ ВВЕДЁН СИМВОЛ
        switch (answer) {
        // тут кейсы я убрал, чтобы не вставлять лишнее
        default:
            printf("Вы ввели некорректное значение.\n");
            flag = 0;
            break;
        }
    } while (flag == 0);
}
  • scanf_s не вызывается на следующем шаге, это я имел в виду в комментариях кода. – Andrea Jones Mar 29 '20 at 14:01
  • scanf_s ожидает число, а в ввод приходит не число. Всё, что она не смогла прочитать, осталось во входном буфере. Нужно его очистить, иначе на следующей итерации она опять будет пытаться прочитать данные, которые не смогла прочитать в прошлый раз. –  Mar 29 '20 at 14:12
  • А как отчистить входной буфер? – Andrea Jones Mar 29 '20 at 14:24
  • Можно в самом конце цикла написать while (getchar() != '\n') continue; –  Mar 29 '20 at 14:28

1 Answers1

2

Надо всегда проверять, все ли правильно прочитано - смотреть возврат функции scanf (_s). И если нет, или если потом идет чтение строки, то надо выполнять сброс.

Просто ошибка при чтении - и первый же не правильный символ остается в буффере. А сбросить до конца строки можно так

while(fgetc(file) != '\n');

или так

fscanf(stdin,"%*[^\n]");
fscanf(stdin,"%*c");

Взял отсюда.

Mikhajlo
  • 12,592