Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/64: Рейтинг темы: голосов - 64, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
1

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

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

Author24 — интернет-сервис помощи студентам
Пусть в программе есть оператор cin >> n, где n типа int, а пользователь вводит набор символов
Как отследить это, не выдавая ошибку, и не зацикливаясь?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2013, 18:17
Ответы с готовыми решениями:

Ввод через пробел. Как остановить ввод. while(cin >> input)
Здравствуйте. Начну с условия задания. Ввести к-во элементов массива. Заполнить массив....

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

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

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

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

Добавлено через 4 минуты
Т.е. нужно проверить, было ли введено число (я так поняла, cin.fail()).
А также пропустить нечисловые символы
И можно ли привести кусок программы, если не тяжело?)
0
433 / 368 / 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
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
5498 / 4893 / 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
415 / 411 / 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, если попытаться ввести не число, то зацикливается
Миниатюры
Корректный ввод с cin  
1
Croessmah
02.06.2013, 18:51
  #9

Не по теме:

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

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

Не по теме:


Win XP?

Не по теме:

Win 7 x64, GCC 4.7

0
0 / 0 / 0
Регистрация: 02.06.2013
Сообщений: 3
02.06.2013, 19:15  [ТС] 11
Oliver, нужно как раз, чтобы не зацикливалось
0
415 / 411 / 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
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
02.06.2013, 20:04 13
Объясните на примере, что должна делать программа в каких ситуациях? КАК МОЖНО больше конкретики, реальный пример в студию

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

Добавлено через 2 минуты
Ещё в консоли линукса никто не запрещает вводить многострочные строки через буфер обмена... Защита будет работать не совсем до конца тогда
0
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
02.06.2013, 20:27 18
Buckstabue, да, этот код подойдет в том случае, если нужно заставить пользователя ввести данные.
На месте автора я бы считал данные в строку string и потом прокручивал ее с помощью stringstream.
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
02.06.2013, 20:29 19
Olivеr, согласен про stringstream, именно это я хотел предложить в случае, если буду уверен, что правильно понял условие задачи.
Жаль, в стандартной библиотеке нет функции для корректного сброса буффера ввода
0
02.06.2013, 20:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2013, 20:29
Помогаю со студенческими работами здесь

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

Проверка на корректный ввод символов
Как исправить? Нужно ввести строку и проверить на корректный ввод. Отмечу, что по заданию...

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru