Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка значений вводимых через cin, Не проверяется заведомо неверный ввод 
:(
    Опции темы
FiMa1
Дата 31.3.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Программа работает нормально до тех пор, пока не будет введено значение, выходящее из диаппазона чисел типа int: Вводим 9999999999, заведомо большее INT_MAX=2147483647 (LIMITS.H) - nmonth=-858993460, и программа виснет в цикле...
Аналогичное значение (-858993460) заносится в nmonth, если была введена, к примеру, буква 'a'.
Добавление проверки условий:
if ( nmonth > INT_MAX || nmonth < INT_MIN ||
     nmonth <= 0 || nmonth > 12 )
    cout << "Wrong entries!" << endl;
не привело к какому-либо положительному результату... cin не реализует проверки значений для заданных типов?
Второй вопрос: do while в цикле ждет корректного ввода, при этом, если нажать Enter, то переход на следующую строку осуществляется, но запрос ввода ("Input number of a month: ") по-прежнему остается в первой строке. Можно как-нибудь пропускать ввод новой строки для этого случая?
Код

/***************************************************************
* программа выводит по номеру месяца (1—январь,2—февраль...)   *
* название соответствующего времени года (зима, весна...)      *
****************************************************************/
#include <iostream>
using namespace std;

int main(void)
{
    int nmonth;

    do {
        cout << "Input number of a month: ";
        cin >> nmonth;
        if ( nmonth > INT_MAX || nmonth < INT_MIN ||
             nmonth <= 0 || nmonth > 12 )
            cout << "Wrong entries!" << endl;
    } while ( nmonth <= 0 || nmonth > 12 ) ;

    switch ( nmonth )
    {
        case 1: case 2: case 12:
            cout << "Time is winter" << endl; break;
        case 3: case 4: case 5:
            cout << "Time is spring" << endl; break;
        case 6: case 7: case 8:
            cout << "Time is summer" << endl; break;
        case 9: case 10: case 11:
            cout << "Time is autumn" << endl; break;
    }
    return 0;
}

PM   Вверх
Xenon
Дата 31.3.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Уберечься от ввода символа и слишком большого числа можно так:
Код

int num;
while (true) 
{ 
    std::cout << "Enter num: ";
    std::cin >> num;
    if (std::cin.good()) 
    {
        std::cin.ignore(10,'\n');
    }
    std::cin.clear();
    std::cout << "Error\n";
    std::cin.ignore(10,'\n');
}


Это сообщение отредактировал(а) Xenon - 31.3.2007, 13:39


--------------------
user posted image  
PM MAIL   Вверх
FiMa1
Дата 31.3.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Спасибо! А что за магическое число -858993460 (см. выше).. никто не знает? Компилировалось в MS VS .NET 2003.
Ну и как игнорировать ввод перехода на новую строку тоже бы было интересно узнать...
PM   Вверх
Xenon
Дата 31.3.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



FiMa1, В смысле ввод перехода на новую строку? Выкинуть из потока '\n' ? Ну так в моем примере он выбрасывается. cin.ignore(10,'\n') сожрет из потока 10 символов + разделитель.


--------------------
user posted image  
PM MAIL   Вверх
vinter
Дата 31.3.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(FiMa1 @  31.3.2007,  15:09 Найти цитируемый пост)
А что за магическое число -858993460 (см. выше)

мусор


--------------------
Мой блог
PM MAIL WWW   Вверх
FiMa1
Дата 31.3.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Всем большое спасибо!!!
PM   Вверх
FiMa1
Дата 31.3.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



To Xenon: выводится лишних предупреждений при вводе более двух символов (например "abc")...

Код

#include <iostream>
using namespace std;

int main(void)
{
    int nmonth;

    do {
        cout << "Input number of a month: ";
        cin >> nmonth;
        if ( cin.good() && nmonth > 0 && nmonth <= 12 )
            cin.ignore(2,'\n');
        else {
            cin.clear();
            cout << "Wrong entries!" << endl;
            cin.ignore(2,'\n');
        }
    } while ( nmonth <= 0 || nmonth > 12 ) ;

    switch ( nmonth )
    {
        /* do something */
    }
    return 0;
}

В случае с std::cin.ignore(10,'\n'); соответственно при вводе больше 10 символов...

Это сообщение отредактировал(а) FiMa1 - 31.3.2007, 17:53
PM   Вверх
Dov
Дата 31.3.2007, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Код
 
   do
    {
        cout << "Input number of a month: ";
        cin >> nmonth;

        if(cin.fail() || nmonth < 1 || nmonth > 12)
        {
            cin.clear();
            cin.ignore(MAX_PATH * 2,'\n');
            cout << "Wrong entries!" << endl;
        }        

    }while(nmonth <= 0 || nmonth > 12);



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
FiMa1
Дата 31.3.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Ну спасибо, Dov, отремонтировал! Разумеется меня такой вариант более чем устраивает, но.... 
Input number of a month: Wrong entries!
Input number of a month: Wrong entries!
Input number of a month: Wrong entries!
Input number of a month: Wrong entries!
Input number of a month: Wrong entries!
Input number of a month: Wrong entries!
Input number of a month: Wrong entries!
при вводе 4094 символов (кажется, максимально возможный ввод для консоли, т.к. после этого ввод был более не возможен)  smile 
ЗЫ: не судите строго за, можно сказать, оффтоп.. Всем еще раз большое спасибо за участие!
PM   Вверх
Xenon
Дата 31.3.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Упс, пардон большой, я сморозил глупость, точнее не доглядел smile
Код

int num;
while (true) 
    { 
    std::cout << "Enter num: ";
    std::cin >> num;
    if (std::cin.good()) 
    {
        std::cin.ignore(2,'\n');
        break; //Забыл :)
    }
    std::cin.clear();
    std::cout << "Error\n";
    std::cin.ignore(2,'\n');

}


Добавлено через 1 минуту и 2 секунды
Но у Dov под ситуацию уже подогнан код - у меня абстрактный пример.


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.