Выполнение scanf с заведомо неверными параметрами - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Необходимо ввести двузначное число для дальнейшей обработки (ввод символов недопустим). Если введен левый символ - затребовать повторный ввод. Пример кода:
void main()
{
  Test();
}
 
void Test()
{
  int x = -1;
  while ((x < 0) || (x > 9))
  {
     scanf("%2d", x);
   }
  printf("ok")
}
Подскажите, пожалуйста, почему при вводе именно символа или строки символов, отличного от числа (например '*'), происходит зацикливание и функция scanf не обрабатывается повторно, т.е. не требует вновь ввести значение.

Решение задачи: «Выполнение scanf с заведомо неверными параметрами»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
void flush_stdin(void) {
    char ch; 
    while ( scanf("%c", &ch) == 1 && ch != '\n' )
        ;
}
 
int get_number(int * number, const int top) {
    return ! ( scanf("%d", number) == 1 && abs(*number) < top );
}
 
int main(void) {
    int n;
    
    while ( printf("Enter two digits number: ") && get_number(&n, 100) ) {
        fprintf(stderr, "Wrong input!\n");
        flush_stdin();
    }
    
    printf("You have entered: %d\n", n);
    
    return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы и .
  2. Определяется функция flush_stdin(), которая предназначена для очистки буфера ввода. Функция использует цикл while, который будет выполняться до тех пор, пока scanf не вернет значение 1 и считываемый символ не будет равен символу новой строки '\n'. В это время в цикле ничего не делается, то есть используется пустой оператор ;.
  3. Определяется функция get_number(), которая принимает указатель на переменную и максимальное значение для этой переменной. Функция возвращает значение не равное 0, если введенное значение не является действительным числом в заданном диапазоне. В этом случае выводится сообщение об ошибке.
  4. В функции main() создается переменная n типа int.
  5. В цикле while выводится приглашение для ввода двухзначного числа и вызывается функция get_number() для проверки корректности введенного значения. Если значение некорректно, выводится сообщение об ошибке и буфер ввода очищается с помощью функции flush_stdin().
  6. После окончания цикла выводится сообщение о введенном числе.
  7. Функция main() возвращает 0, что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5