Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2012, 21:11   #1
Rock145
Пользователь
 
Регистрация: 29.06.2012
Сообщений: 19
По умолчанию cin в while

Доброго дня суток. Я начинающий программист на с++ и начал учить его не так давно. Недавно начал писать программку, но сразу же наткнулся на проблему. Мне надо сделать проверку числа при вводе. Нужно чтобы оно было целым. Все бы ничего, но код зависает в бесконечном цикле. Вроде бы все правильно... Помогите кто чем может))))

Код:
int _tmain(int argc, _TCHAR* argv[])
{	
	int a,b,c;
	bool success=false;

	cout<<("plz, enter integer \n");
	while (!success)
	{
		cin>>c;
		if (cin.good())
		{
			success=true;
			if (summsqr(a,b,c))
				cout<<(a)<<endl<<(b)<<endl;
			else
				cout<<("didn't find this kind of integers \n");

			system("pause");
		} else
		{
			cout<<("this value is wrong. plz, enter integer value\n");
		}
	}

	return 0;
}
P.S. конкретней зависает в while!
Rock145 вне форума Ответить с цитированием
Старый 09.09.2012, 22:19   #2
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

переменную c лучше сделать тип char, а потом пробовать парсить в инт
bedman вне форума Ответить с цитированием
Старый 09.09.2012, 22:22   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
надо сделать проверку числа при вводе.
А может лучше делать проверку после ввода?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.09.2012, 23:33   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Rock145 Посмотреть сообщение
Доброго дня суток. Я начинающий программист на с++ и начал учить его не так давно. Недавно начал писать программку, но сразу же наткнулся на проблему. Мне надо сделать проверку числа при вводе. Нужно чтобы оно было целым. Все бы ничего, но код зависает в бесконечном цикле. Вроде бы все правильно... Помогите кто чем может))))

Код:
int _tmain(int argc, _TCHAR* argv[])
{	
	int a,b,c;
	bool success=false;

	cout<<("plz, enter integer \n");
	while (!success)
	{
		cin>>c;
		if (cin.good())
		{
			success=true;
			if (summsqr(a,b,c))
				cout<<(a)<<endl<<(b)<<endl;
			else
				cout<<("didn't find this kind of integers \n");

			system("pause");
		} else
		{
			cout<<("this value is wrong. plz, enter integer value\n");
                        cin.clear();
                        cin.rdbuf()->pubseekpos(0);
		}
	}

	return 0;
}
P.S. конкретней зависает в while!
Когда стрим ломается, у него выставляется флаг о внутренней ошибки. Этот флаг нужно почистить. При этом, несмотря на поломку, он уже зажевал какие то байты в свой внутренний буфер. Нужно "почистить буфер".
В данном случае, я просто перемотал позицию внутри этого буфера на начало. Новая запись затрет старую.
_Bers вне форума Ответить с цитированием
Старый 10.09.2012, 00:14   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Можно ещё вот так вот сделать:


Код:
    int c=0; bool success=false;
    cout<<("plz, enter integer \n");
    while (!success)
    {
        cin>>c;
        if (cin.good())
        {
            std::cout<<"c = "<<c<<endl; 
            success=true; 
            system("pause");
        }
        else
        {
            cout<<("this value is wrong. plz, enter integer value\n");
            cin.clear();    //очищаем флаги состояния механизма.
            fflush(stdin);  //ощищаем буфер от старых некорретных данных.
        }
    }
_Bers вне форума Ответить с цитированием
Старый 10.09.2012, 03:16   #6
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Как то вы буфер очищаете по умному я так не видел еще. Как на счет cin.sync(), я всегда так очищал его или в этом если недостатки
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 10.09.2012, 13:49   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
Код:
            fflush(stdin);  //ощищаем буфер от старых некорретных данных.
нельзя fflush применять к потокам ввода.

2kineziz
Цитата:
Как то вы буфер очищаете по умному я так не видел еще
умного в этом ничего нет криво и непортабельно.

вон правильно говорят. читай в строку, проверяй, что это нужная тебе последовательность символов. все анализаторы входных данных в консольных приложениях так и поступают. никто не пишет scanf("%d", &i) или cin >> i, ибо эти вещи чреваты ошибками. это можно писать только в тех случаях, когда ты уверен, что будет введено число (например, читаешь из структурированного файла). но даже тут нужно проверять на ошибки. вот в таких случаях и нужны все эти методы good() bad() и т.д. в твоем же - просто читай строку.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 10.09.2012 в 13:58.
pproger вне форума Ответить с цитированием
Старый 10.09.2012, 20:16   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers
Код:
            fflush(stdin);  //ощищаем буфер от старых некорретных данных.
нельзя fflush применять к потокам ввода.
Почему?

И кстати, накой парсить строчку, если всегда можно проверить флаг, и зачистить буфер стрима? По-моему, парсить строчку в этом случае - мартышкин труд.
_Bers вне форума Ответить с цитированием
Старый 10.09.2012, 20:26   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

гцц/мингв/студия прожевали, и ничо так. В чем именно заключается не портабельность?

Последний раз редактировалось pproger; 11.09.2012 в 19:13.
_Bers вне форума Ответить с цитированием
Старый 11.09.2012, 19:12   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
гцц/мингв/студия прожевали, и ничо так. В чем именно заключается не портабельность?
если код скомпилился и даже работает в отдельных случаях, это не значит, что он правильный (в данном случае портабельный).
криво - потому что ты использовал c-style stream в с++. непортабельно - вызов fflush на поток ввода - неопределенное поведение

Цитата:
man fflush
...
The standards do not specify the behavior for input streams.
хотя сейчас почитал, во многих реализациях действительно делает то, что требуется, буквально пару лет назад в том же линуксе это было не так.
Цитата:
И кстати, накой парсить строчку, если всегда можно проверить флаг, и зачистить буфер стрима? По-моему, парсить строчку в этом случае - мартышкин труд.
по вышеназванной причине.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
cin и cin.get NightEagle Общие вопросы C/C++ 8 30.03.2011 18:23
cin.get в while kaljan775 Общие вопросы C/C++ 6 30.09.2010 14:59
Cin _-Re@l-_ Общие вопросы C/C++ 8 25.06.2010 23:17
cin ReaktiV Общие вопросы C/C++ 3 31.05.2010 15:57
cin??? Paul_AG Общие вопросы C/C++ 4 24.04.2009 14:02