Scanf пропускает следующий ввод - C (СИ)

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

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

Есть такое:
    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);
Функция inputs() проверяет то что ввёл пользователь. Идёт всё в цикле пока не будет оборвано. Проблема в том, что сканф после ввода впихивает в следующий Name что-то невидимое (энтер?) и пропускается ввод. Что делать?

Решение задачи: «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);

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

  1. Объявление переменных:
    • error - используется для контроля ошибок;
    • zip_tmp - временное хранение введенного значения;
    • clear_buffer - функция для очистки буфера ввода;
    • error_w - флаг для контроля ошибок ввода;
    • zip_id - количество записей в базе данных;
    • zip_base - база данных.
  2. Ввод значения:
    • Вывод сообщения Zip:;
    • Ввод значения с помощью функции scanf в переменную zip_tmp;
    • Очистка буфера ввода с помощью функции clear_buffer.
  3. Проверка введенного значения:
    • Проверка диапазона введенного значения (меньше 10000 или больше 99999);
    • Если значение не в диапазоне, выводится сообщение Wrong zip! и устанавливается флаг error в 1;
    • Если введенное значение уже есть в базе данных, выводится сообщение Zip is already in base!.
  4. Цикл для повторного ввода:
    • Цикл выполняется до тех пор, пока флаг error равен 1.
  5. Вывод сообщения и ввод значения:
    • Если введенное значение не вызывает ошибку, оно присваивается переменной zip_tmp;
    • Если введенное значение вызывает ошибку, ничего не происходит.
  6. Вывод сообщения и ввод значения:
    • Если введенное значение не вызывает ошибку, оно присваивается переменной zip_tmp;
    • Если введенное значение вызывает ошибку, ничего не происходит.

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


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

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

11   голосов , оценка 4.364 из 5
Похожие ответы