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

С++ для начинающих

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

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

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

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

Корректный ввод структуры и ее обработка - C++
Добрый день. Есть вопрос, как мне правильно ввести структуру, что бы потом корректно с ней работать. Задание:Нужно составить...

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

Проверка на корректный ввод числа - C++
Вводится число, если оно введено верно, нужно вывести hello world это количество раз, а если введено что-либо другое, то вывести Error. ...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2013, 18:32 #2
Опишите, что такое "отследить".
0
Issues
430 / 365 / 37
Регистрация: 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 / 37
Регистрация: 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
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 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
5419 / 4815 / 442
Регистрация: 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 / 13
Регистрация: 06.10.2011
Сообщений: 831
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 / 13
Регистрация: 06.10.2011
Сообщений: 831
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 / 13
Регистрация: 06.10.2011
Сообщений: 831
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
175 / 124 / 6
Регистрация: 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 / 13
Регистрация: 06.10.2011
Сообщений: 831
02.06.2013, 20:16 #14
Цитата Сообщение от Buckstabue Посмотреть сообщение
А если пользователь вводит числа через пробел, то они исчезают?
За один вызов функции - один ввод числа. Если написать 55 56 (через пробел), то функция вернёт 55.
Всё, что написано в теле функции, позволяет сделать защиту от дураков (\n, буквы при вводе числа и тд).
0
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
02.06.2013, 20:18 #15
Olivеr, это ясно, а что будет при последующих вызовах функции? Как она будет вести себя на "aaaa 666"?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2013, 20:18
Привет! Вот еще темы с ответами:

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

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

Ввод cin - C++
Я тут раньше задавал подобный вопрос, то тема умерла, по ходу. Здесь приведен листинг функции ввода калькулятора из книги Страуструпа. ...

Ввод с cin с пробелами - C++
Здравствуйте! Делаю стандартное задание по структурам. Пока сделано только добавление и показ всего. Но вот проблемка. Если название...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.06.2013, 20:18
Ответ Создать тему
Опции темы

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