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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.78
azargul
5 / 5 / 0
Регистрация: 22.10.2010
Сообщений: 44
#1

Контроль правильности ввода в int - C++

02.10.2011, 09:25. Просмотров 6689. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include"iostream.h"
 
int main() {
    int n;
    cout << "vvedite kolichestvo tochek (ot 2 do 5000) = ";
    cin >> n;
    if (cin.fail()) {
    cin.clear();
    cin.ignore(cin.rdbuf() -> in_avail());
    cout << "Nepravilnii vvod - zapreshen vvod bykv";
    getch();
    return(0);
    }
}
C++
1
2
3
4
if (cin.fail()) {
    cin.clear();
    cin.ignore(cin.rdbuf() -> in_avail());
}
Было необходимо проконтролировать ввод - что бы при вводе пользователем букв на первых местах выводило сообщение с ошибкой, а при наличии первого символа-цифры продолжалась работа программы. Нашел в инете код(работает так как нужно), потому что самому не удалось придумать как это сделать. Но не могу понять, выделенную отдельным кодом, часть. Объясните пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2011, 09:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Контроль правильности ввода в int (C++):

Проверка правильности ввода - C++
Доброго времени суток. Как, в приведенном ниже коде, сделать так, что бы при вводе отрицательного числа выводилось не &quot;сколько минут вы...

Проверка правильности ввода - C++
1)Вывести ошибку в консоль, если в символ пользователь пытается вбить строку. 2)Вывести ошибку в консоль, если строка не является...

Проверка правильности ввода - C++
Совсем запуталась.Надо ввести целое число. Как сделать так, чтобы при неправильном вводе(символ, буква), выдавалась ошибка?

Проверка правильности ввода - C++
Пишу программу С++ в консоле в RAD Studio. Программа представляет собой задачу. Пользователь вводит число, а программа решает. Мне нужно...

Проверка правильности ввода числа - C++
Всем привет! Прошу помочь с такой задачей: Дано число в двоичной системе счисления. Проверить правильность ввода этого числа (в его...

Проверка правильности ввода числа - C++
Здравствуйте. Помогите с функцией проверки ввода на число. Число любое (целое, дробное).

6
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
02.10.2011, 10:23 #2
Извлекает из потока символы и отбрасывает их.
У потока ввода есть буфер чтения, в котором он хранит символы. Мы обращаемся к нему, вызывая функцию rdbuf(). А любой уважающий себя буфер знает, сколько символов в нем содержится. Поскольку и мы хотим это узнать, мы вызываем функцию in_avail() этого буфера. Это количество символов нам и нужно проигнорировать, что достигается так:

C
1
cin.ignore(cin.rdbuf()->in_avail());
Добавлено через 3 минуты
C
1
cin.clear();
очищение буфера
2
azargul
5 / 5 / 0
Регистрация: 22.10.2010
Сообщений: 44
02.10.2011, 22:04  [ТС] #3
Цитата Сообщение от robert19 Посмотреть сообщение
Извлекает из потока символы и отбрасывает их.
У потока ввода есть буфер чтения, в котором он хранит символы. Мы обращаемся к нему, вызывая функцию rdbuf(). А любой уважающий себя буфер знает, сколько символов в нем содержится. Поскольку и мы хотим это узнать, мы вызываем функцию in_avail() этого буфера. Это количество символов нам и нужно проигнорировать, что достигается так:

C
1
cin.ignore(cin.rdbuf()->in_avail());
Добавлено через 3 минуты
C
1
cin.clear();
очищение буфера
Cin.fail - когда будет истинно когда ложно? Если это условие истино, то мы игнорируем текущее кол-во символов в буфере? Тогда вопрос, зачем перед этим его очистить? Или cin.ignore(cin.rdbuf()->in_avail()); и cin.clear() при использовании по отдельности приведут к одинаковому эффекту, просто в одном случае у нас произойдет очистка буфера, а в другом нет? Наверно плохо у меня с выражением мысли, но стоит ли игнорировать cin после очистки буфера? Или всетаки я не доконца понял работу этого куска проги

Добавлено через 8 часов 39 минут
подскажите пожалуйста
1
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
02.10.2011, 22:27 #4
Цитата Сообщение от azargul Посмотреть сообщение
Cin.fail - когда будет истинно когда ложно?
http://www.cplusplus.com/reference/iostream/ios/fail/
Цитата Сообщение от azargul Посмотреть сообщение
Если это условие истино, то мы игнорируем текущее кол-во символов в буфере?
Да, но лично я советовал бы сделать так
C++
1
2
3
4
5
#include <iostream>
#include <limits>
//...
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
//...
потому как вариант с cin.rdbuf() -> in_avail(), если не ошибаюсь, непереносим.

Цитата Сообщение от azargul Посмотреть сообщение
Тогда вопрос, зачем перед этим его очистить? Или cin.ignore(cin.rdbuf()->in_avail()); и cin.clear() при использовании по отдельности приведут к одинаковому эффекту, просто в одном случае у нас произойдет очистка буфера, а в другом нет?
clear очищает не буфер, а флаг состояния потока.
http://www.cplusplus.com/reference/iostream/ios/clear/
1
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
02.10.2011, 22:51 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
int main() {
    int n;
    cout << "vvedite kolichestvo tochek (ot 2 do 5000) = ";
    cin >> n;
    bool success = false;
    while (success==false){     // крутим пока false, в true тормозим
        if ((cin.fail()==0)&&(n)) 
            success = true; // если нет ошибок в входном потоке даём true для стопа цикла
        else{               // если есть ошибки
            cout << "Nepravilnii vvod - zapreshen vvod bykv"<<endl;
            cin.clear();    //очищает ошибки входного потока для флажка cin.fail
            cin.ignore(cin.rdbuf() -> in_avail());  //удаляем символы в буфере
            cout << "vvedite kolichestvo tochek (ot 2 do 5000) = ";
            cin >> n;
        }
    }
    cout << "Ok!"<<endl;
    return(0);
}
1
azargul
5 / 5 / 0
Регистрация: 22.10.2010
Сообщений: 44
03.10.2011, 14:43  [ТС] #6
Цитата Сообщение от robert19 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
int main() {
    int n;
    cout << "vvedite kolichestvo tochek (ot 2 do 5000) = ";
    cin >> n;
    bool success = false;
    while (success==false){     // крутим пока false, в true тормозим
        if ((cin.fail()==0)&&(n)) 
            success = true; // если нет ошибок в входном потоке даём true для стопа цикла
        else{               // если есть ошибки
            cout << "Nepravilnii vvod - zapreshen vvod bykv"<<endl;
            cin.clear();    //очищает ошибки входного потока для флажка cin.fail
            cin.ignore(cin.rdbuf() -> in_avail());  //удаляем символы в буфере
            cout << "vvedite kolichestvo tochek (ot 2 do 5000) = ";
            cin >> n;
        }
    }
    cout << "Ok!"<<endl;
    return(0);
}
Огромное спасибо. Только не совсем понял эту часть условия if ((cin.fail()==0)&&(n)) как оно вообще повлияет на работу этого куска программы?
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
03.10.2011, 15:18 #7
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
#include <iostream>
#include <limits>
 
int main()
{
    int n = 0;
    
    for(;;)
    {
        std::cout << "vvedite kolichestvo tochek (ot 2 do 5000) = ";
        std::cin >> n;
 
        if(std::cin.fail()) // if( !(std::cin >> n) )
        {
            std::cout << "Nepravilnii vvod - zapreshen vvod bykv" << '\n';
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        else if(n >= 2 && n <= 5000) break;
    }
 
    std::cout << "Ok!\n";
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2011, 15:18
Привет! Вот еще темы с ответами:

Проверка правильности ввода строки - C++
Доброго дня! Имеется строка string str, задана изначально, пользователь вводит с клавиатуры другую строку string proverka, нужно проверить...

Проверка правильности ввода. Запретить ввод чисел - C++
Здравствуйте форумчане! Хочу сделать в коде проверку типа: если вводить, где положено string -числа, то выходит сообщение &lt;Not...

Напишите пожалуйста Алгоритм правильности ввода цифр - C++
Ну тоесть, чтобы он проверял ввёл я цифру или нет. Например когда я буду вводить букву , будет выходить Ошибка

Обеспечение правильности ввода через повторный запрос - C++
нужно сделать так, чтобы когда вводишь букву выдавало ошибку и просило повторить ввод #include &lt;conio.h&gt; #include&lt;stdio.h&gt; ...


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

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

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