Scanf пропускает следующий ввод - C (СИ)
Формулировка задачи:
Есть такое:
Функция inputs() проверяет то что ввёл пользователь. Идёт всё в цикле пока не будет оборвано.
Проблема в том, что сканф после ввода впихивает в следующий Name что-то невидимое (энтер?) и пропускается ввод.
Что делать?
inputs("Name: ", info->name, 30);
if(!info->name[0]) break;
inputs("Street: ", info->street, 40);
inputs("City: ", info->city, 20);
inputs("Lok: ", info->state, 3);
printf("Zip: "); scanf("%d", info->zip);Решение задачи: «Scanf пропускает следующий ввод»
textual
Листинг программы
do{
error = 0;
printf("Zip: ");
scanf("%d", &zip_tmp);
clear_buffer();
error_w = 0;
if (zip_tmp<10000 || zip_tmp>99999) {
printf("Wrong zip!\n");
error = 1;
error_w = 1;
}
//info->zip = zip_tmp;
for (i=0; i<=zip_id; i++){
if (zip_base[i] == zip_tmp){
error = 1;
if (error_w != 1) {
printf("Zip is already in base!\n");
}
}
}
} while(error == 1);
Объяснение кода листинга программы
- Объявление переменных:
- error - используется для контроля ошибок;
- zip_tmp - временное хранение введенного значения;
- clear_buffer - функция для очистки буфера ввода;
- error_w - флаг для контроля ошибок ввода;
- zip_id - количество записей в базе данных;
- zip_base - база данных.
- Ввод значения:
- Вывод сообщения
Zip:; - Ввод значения с помощью функции scanf в переменную zip_tmp;
- Очистка буфера ввода с помощью функции clear_buffer.
- Вывод сообщения
- Проверка введенного значения:
- Проверка диапазона введенного значения (меньше 10000 или больше 99999);
- Если значение не в диапазоне, выводится сообщение
Wrong zip!и устанавливается флаг error в 1; - Если введенное значение уже есть в базе данных, выводится сообщение
Zip is already in base!.
- Цикл для повторного ввода:
- Цикл выполняется до тех пор, пока флаг error равен 1.
- Вывод сообщения и ввод значения:
- Если введенное значение не вызывает ошибку, оно присваивается переменной zip_tmp;
- Если введенное значение вызывает ошибку, ничего не происходит.
- Вывод сообщения и ввод значения:
- Если введенное значение не вызывает ошибку, оно присваивается переменной zip_tmp;
- Если введенное значение вызывает ошибку, ничего не происходит.