Выполнение scanf с заведомо неверными параметрами - C (СИ)
Формулировка задачи:
Необходимо ввести двузначное число для дальнейшей обработки (ввод символов недопустим).
Если введен левый символ - затребовать повторный ввод.
Пример кода:
Подскажите, пожалуйста, почему при вводе именно символа или строки символов, отличного от числа (например '*'), происходит зацикливание и функция scanf не обрабатывается повторно, т.е. не требует вновь ввести значение.
void main() { Test(); } void Test() { int x = -1; while ((x < 0) || (x > 9)) { scanf("%2d", x); } printf("ok") }
Решение задачи: «Выполнение 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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
и . - Определяется функция flush_stdin(), которая предназначена для очистки буфера ввода. Функция использует цикл while, который будет выполняться до тех пор, пока scanf не вернет значение 1 и считываемый символ не будет равен символу новой строки '\n'. В это время в цикле ничего не делается, то есть используется пустой оператор
;
. - Определяется функция get_number(), которая принимает указатель на переменную и максимальное значение для этой переменной. Функция возвращает значение не равное 0, если введенное значение не является действительным числом в заданном диапазоне. В этом случае выводится сообщение об ошибке.
- В функции main() создается переменная n типа int.
- В цикле while выводится приглашение для ввода двухзначного числа и вызывается функция get_number() для проверки корректности введенного значения. Если значение некорректно, выводится сообщение об ошибке и буфер ввода очищается с помощью функции flush_stdin().
- После окончания цикла выводится сообщение о введенном числе.
- Функция main() возвращает 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д