Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
julia111
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
#1

Корректный ввод с cin - C++

02.06.2013, 18:17. Просмотров 3214. Ответов 18
Метки нет (Все метки)

Пусть в программе есть оператор cin >> n, где n типа int, а пользователь вводит набор символов
Как отследить это, не выдавая ошибку, и не зацикливаясь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2013, 18:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Корректный ввод с cin (C++):

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже...

Проверка на корректный ввод числа
Мне нужно вывести hello world то количество раз, какое напишет пользователь, но...

Проверка на корректный ввод числа
Вводится число, если оно введено верно, нужно вывести hello world это...

Как организовать корректный ввод?
Добрый день всем. Собственно говоря вопрос такой есть класс data, я...

Корректный ввод структуры и ее обработка
Добрый день. Есть вопрос, как мне правильно ввести структуру, что бы потом...

Корректный ввод данных, goodbit,зацикливание
Всем привет! У меня вопрос следующего характера. Не понятно почему происходит...

18
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2013, 18:32 #2
Опишите, что такое "отследить".
0
Issues
430 / 365 / 149
Регистрация: 06.08.2012
Сообщений: 961
02.06.2013, 18:35 #3
C++
1
std::cin.fail();
0
julia111
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
02.06.2013, 18:40  [ТС] #4
Есть программа, в которой считываются целые числа через cin.
Необходимо после каждого считывания проверять, было ли считано число или буква
В cin должны быть какие-то флаги, типа cin.fail(), который вроде-как показывает подобную ошибку
Но я хочу узнать, так ли это, а также как пропустить введенные буквы (типа cin.ignore(), но я не уверена).
Не подскажете ли?

Добавлено через 4 минуты
Т.е. нужно проверить, было ли введено число (я так поняла, cin.fail()).
А также пропустить нечисловые символы
И можно ли привести кусок программы, если не тяжело?)
0
Issues
430 / 365 / 149
Регистрация: 06.08.2012
Сообщений: 961
02.06.2013, 18:41 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int main()
{
    int n;
 
    do
    {
        std::cout << "ENTER NUMBER | 0-EXIT: "; std::cin >> n;
 
        if (std::cin.fail()) { std::cerr << "ERROR! \n";
            std::cin.clear(); std::cin.sync();
            continue;
        }
    } while (n != 0);
 
    system("PAUSE");
    return 0;
}
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
02.06.2013, 18:42 #6
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
#include <iostream>
int InputNumber(const int min,const int max,const char * szMessage){
    int x;
    if(szMessage)
        std::cout<<szMessage;
    else
        std::cout<<"Please, enter number ["<<min<<","<<max<<"] ->";
    bool ErrorFlag;
    do{
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin>>x;
        ErrorFlag=!std::cin.good() || x>max || x<min;
        if(ErrorFlag){
            if(szMessage)
                std::cout<<"Error. "<<szMessage<<std::endl;
            else
                std::cout<<"Error. Enter number ["<<min<<","<<max<<"] ->"<<std::endl;
        }
    }while(ErrorFlag);
    std::cin.ignore(std::cin.rdbuf()->in_avail());
    return x;
}
int main(){
    int a = InputNumber(1,9,NULL);
    int b = InputNumber(17,18,"Enter b: ");
}
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2013, 18:45 #7
Можно так:
C++
1
2
3
4
5
6
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
Если вывод ошибки не нужен, то cout можно убрать. Выход из цикла - если во введённом наборе символов будут только цифры (перед которыми может быть один + или - ).
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
02.06.2013, 18:49 #8
не отпустит пока не будет введено корректное значение
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
#include <iostream>
#include <limits>
 
using namespace std;
 
template <typename T>
T DefInput(istream &is = cin)
{
    T val;
    is.clear();
    is >> val;
    while ( !is.good() ) {
        is.clear();
        is.ignore(numeric_limits<streamsize>::max(), '\n');
        is >> val;
    }
    return val;
}
 
int main()
{
    int a = DefInput<int>();
    cout << a;
    return 0;
}

Croessmah, если попытаться ввести не число, то зацикливается
1
Миниатюры
Корректный ввод с cin  
Croessmah
02.06.2013, 18:51
  #9

Не по теме:

Цитата Сообщение от Olivеr Посмотреть сообщение
Croessmah, если попытаться ввести не число, то зацикливается
Win XP?

0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
02.06.2013, 19:11 #10
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


Win XP?

Не по теме:

Win 7 x64, GCC 4.7

0
julia111
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
02.06.2013, 19:15  [ТС] #11
Oliver, нужно как раз, чтобы не зацикливалось
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
02.06.2013, 19:33 #12
julia111, нужно считать число и если считывание не удалось, то вывести сообщение об ошибке?
Тогда можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <limits>
 
using namespace std;
 
int main()
{
    int a;
    cin >> a;
    if (cin.fail()) cout << "error"; //проверяет флаги badbit и failbit
    return 0;
}
подробнее тут
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
02.06.2013, 20:04 #13
Объясните на примере, что должна делать программа в каких ситуациях? КАК МОЖНО больше конкретики, реальный пример в студию

Добавлено через 4 минуты
Цитата Сообщение от Olivеr Посмотреть сообщение
is.ignore(numeric_limits<streamsize>::max(), '\n');
А если пользователь вводит числа через пробел, то они исчезают? Не лучше ли сделать "ручной" цикл типа этого
while (curChar = in.get(), isspace(curChar));
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
02.06.2013, 20:16 #14
Цитата Сообщение от Buckstabue Посмотреть сообщение
А если пользователь вводит числа через пробел, то они исчезают?
За один вызов функции - один ввод числа. Если написать 55 56 (через пробел), то функция вернёт 55.
Всё, что написано в теле функции, позволяет сделать защиту от дураков (\n, буквы при вводе числа и тд).
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
02.06.2013, 20:18 #15
Olivеr, это ясно, а что будет при последующих вызовах функции? Как она будет вести себя на "aaaa 666"?
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
02.06.2013, 20:20 #16
"aaaa 666" - считает aaaa, это не число, значит ошибка и начинаем сначала.
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
02.06.2013, 20:25 #17
Olivеr, но ведь пропадает 666. Хотя формулировка вопроса странная. То она пишет, что вводится число, то числа

Добавлено через 2 минуты
Ещё в консоли линукса никто не запрещает вводить многострочные строки через буфер обмена... Защита будет работать не совсем до конца тогда
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
02.06.2013, 20:27 #18
Buckstabue, да, этот код подойдет в том случае, если нужно заставить пользователя ввести данные.
На месте автора я бы считал данные в строку string и потом прокручивал ее с помощью stringstream.
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
02.06.2013, 20:29 #19
Olivеr, согласен про stringstream, именно это я хотел предложить в случае, если буду уверен, что правильно понял условие задачи.
Жаль, в стандартной библиотеке нет функции для корректного сброса буффера ввода
0
02.06.2013, 20:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2013, 20:29
Привет! Вот еще темы с решениями:

Проверка на корректный ввод. Выходит из цикла раньше времени
Хочется чтобы код заставлял вводить юзера снова и снова пока тот не ввидет...

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до...

Ввод cin
Я тут раньше задавал подобный вопрос, то тема умерла, по ходу. Здесь приведен...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru