Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/55: Рейтинг темы: голосов - 55, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 14.11.2019
Сообщений: 13

Обработка некорректного пользовательского ввода

17.11.2019, 17:55. Показов 11056. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла трудность в написании кода. У меня есть проверка вводимого пользователем значения на то, является ли оно числом. Работает почти корректно в том плане, что если введешь, например, "q", то программа попросит еще раз ввести число. Но если пользователь введет, например, "144wr1", то она занесет "144". Как сделать так, чтобы программа и в этом случае просила ввести значение снова? И как можно сделать проверку на то, чтоб при вводе пункта назначения пользователь не мог вводить цифры?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
struct Aeroflot {
    char* place;
    int number;
    char* type_air;
};
void cin_air(Aeroflot* a, int m) {
    int pr;
    for (int i = 0; i < m; i++) {
        bool pr1 = false;
        cout << "Введите пункт назначения рейса" << endl;
        a[i].place = new char[20];
        cin >> a[i].place;
        while (pr1==false) {
            cout << "Введите номер рейса" << endl;
            cin >> pr;
            if (std::cin.fail()) // если предыдущее извлечение оказалось неудачным,
            {
                std::cin.clear(); // то возвращаем cin в 'обычный' режим работы
                std::cin.ignore(32767, '\n'); // и удаляем значения предыдущего ввода из входного буфера
                std::cout << "Попробуйте еще раз.\n";
            }
            else
            {
                std::cin.ignore(32767, '\n'); // удаляем лишние значения
 
                a[i].number = pr;
                pr1 = true;
            }
        }
        cout << "Введите тип самолета" << endl;
        a[i].type_air = new char[20];
        cin >> a[i].type_air;
    }
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2019, 17:55
Ответы с готовыми решениями:

Защита от некорректного ввода
Помогите, пожалуйста, с защитой от некорректного ввода! Программа выполняет задания с помощью рекурсии. Хотел написать защиту на ввод...

Защита от некорректного ввода
Приветствую, помогите, пожалуйста, реализовать защиту от некорректного ввода. Должны быть допустимы только числовые значения. double...

Защита от некорректного ввода
Подскажите пожалуйста как доработать защиту от некорректного ввода: // ConsoleApplication4.cpp : Defines the entry point for the console...

6
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
18.11.2019, 04:42
проверка на число:
C++
1
2
3
4
5
6
7
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Input error! Retry input" << endl;
}
1
0 / 0 / 0
Регистрация: 14.11.2019
Сообщений: 13
18.11.2019, 06:59  [ТС]
Спасибо, работает!
А как сделать проверку на то, чтобы в char нельзя было вводить всё (цифры, знаки), кроме букв?
0
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
18.11.2019, 07:49
Лучший ответ Сообщение было отмечено Bambuchka как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Следующая программа производит проверку каждого символа, считанного из stdin, и выводит сообщения о тех
 из них, которые являются буквами алфавита:
#include <ctype.h>
#include <stdio.h>
int main(void)
{
     char ch;
     for(;;) 
     {
          ch = getchar();
          if (ch==' ') break;
          if (isalpha (ch)) printf ("%c is a letter\n", ch);
     }
     return 0;
}
1
14 / 11 / 3
Регистрация: 16.10.2019
Сообщений: 95
18.11.2019, 08:44
Yetty, у Вас очень добрые глаза, объясните пожалуйста условие первого while. Да, так, чтобы даже я понял.
0
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
18.11.2019, 15:56
ИгорьКачук, там же русским по белому написано
Цитата Сообщение от Yetty Посмотреть сообщение
проверка на число
Сам не знал, что так можно, но тем не менее:
- !(cin >> a) - должно быть число, а не что угодно другое
- (cin.peek() != '\n') - уточняем, целым ли было число или с плавающей точкой (после целого числа идет энтер)
2
14 / 11 / 3
Регистрация: 16.10.2019
Сообщений: 95
18.11.2019, 16:59
БедолагаЖека, ни я один сказал спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2019, 16:59
Помогаю со студенческими работами здесь

Защита от некорректного ввода
Здравствуйте. 1 курс, полный нуб. Знаю только cin и cout, массивы. Пока все было нормально, но препод требует написать защиту от дурака,...

Защита от некорректного ввода
Здравствуйте. 1 курс, полный нуб. Знаю только cin и cout, массивы. Пока все было нормально, но помошник препода требует написать защиту от...

Защита от некорректного ввода
Помогите сделать так, что при вводе букв программа продолжала работать: запрещала ввод букв(только цифры) или просто не учитывала их. Как...

Защита от некорректного ввода
Здравствуйте! Нужно осуществить контроль при заполнении матрицы, если введены не корректные данные, вывести сообщение, и переспросить...

Защита от некорректного ввода
Будьте добры, помогите написать защиту от дурака на ввод массива элементы которого тип float Буду очень благодарен.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru