Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
julia111
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
02.06.2013, 18:17     Корректный ввод с cin #1
Пусть в программе есть оператор cin >> n, где n типа int, а пользователь вводит набор символов
Как отследить это, не выдавая ошибку, и не зацикливаясь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2013, 18:32     Корректный ввод с cin #2
Опишите, что такое "отследить".
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
02.06.2013, 18:35     Корректный ввод с cin #3
C++
1
std::cin.fail();
julia111
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
02.06.2013, 18:40  [ТС]     Корректный ввод с cin #4
Есть программа, в которой считываются целые числа через cin.
Необходимо после каждого считывания проверять, было ли считано число или буква
В cin должны быть какие-то флаги, типа cin.fail(), который вроде-как показывает подобную ошибку
Но я хочу узнать, так ли это, а также как пропустить введенные буквы (типа cin.ignore(), но я не уверена).
Не подскажете ли?

Добавлено через 4 минуты
Т.е. нужно проверить, было ли введено число (я так поняла, cin.fail()).
А также пропустить нечисловые символы
И можно ли привести кусок программы, если не тяжело?)
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
02.06.2013, 18:41     Корректный ввод с cin #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;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
02.06.2013, 18:42     Корректный ввод с cin #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: ");
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2013, 18:45     Корректный ввод с cin #7
Можно так:
C++
1
2
3
4
5
6
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
Если вывод ошибки не нужен, то cout можно убрать. Выход из цикла - если во введённом наборе символов будут только цифры (перед которыми может быть один + или - ).
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
02.06.2013, 18:49     Корректный ввод с cin #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, если попытаться ввести не число, то зацикливается
Миниатюры
Корректный ввод с cin  
Croessmah
02.06.2013, 18:51
  #9

Не по теме:

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

Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
02.06.2013, 19:11     Корректный ввод с cin #10
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


Win XP?

Не по теме:

Win 7 x64, GCC 4.7

julia111
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
02.06.2013, 19:15  [ТС]     Корректный ввод с cin #11
Oliver, нужно как раз, чтобы не зацикливалось
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
02.06.2013, 19:33     Корректный ввод с cin #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;
}
подробнее тут
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
02.06.2013, 20:04     Корректный ввод с cin #13
Объясните на примере, что должна делать программа в каких ситуациях? КАК МОЖНО больше конкретики, реальный пример в студию

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

Добавлено через 2 минуты
Ещё в консоли линукса никто не запрещает вводить многострочные строки через буфер обмена... Защита будет работать не совсем до конца тогда
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
02.06.2013, 20:27     Корректный ввод с cin #18
Buckstabue, да, этот код подойдет в том случае, если нужно заставить пользователя ввести данные.
На месте автора я бы считал данные в строку string и потом прокручивал ее с помощью stringstream.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2013, 20:29     Корректный ввод с cin
Еще ссылки по теме:

C++ Как организовать корректный ввод?
C++ Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Игнорирует ввод cin C++

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

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
02.06.2013, 20:29     Корректный ввод с cin #19
Olivеr, согласен про stringstream, именно это я хотел предложить в случае, если буду уверен, что правильно понял условие задачи.
Жаль, в стандартной библиотеке нет функции для корректного сброса буффера ввода
Yandex
Объявления
02.06.2013, 20:29     Корректный ввод с cin
Ответ Создать тему
Опции темы

Текущее время: 10:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru