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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2012, 17:40   #11
Br0m
Пользователь
 
Регистрация: 25.01.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
ну от этого тоже мало толку. юзер введет 123qwe enter. в целочисленную переменную запишется 123, ты подавляешь q, we\n сидят в буфере.
это понятно, но объясните, пожалуйста, допустим есть

Код:
scanf("%d", &m);
scanf("%*[^\n]%*с");
не работает как вы описали. Например, вводим 1qwe enter, после этого второй scanf ожидает ввода, после которого все что ввели остается в потоке ввода
Br0m вне форума Ответить с цитированием
Старый 25.01.2012, 18:39   #12
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Br0m
))))
Цитата:
scanf("%*[^\n]%*с");
тут сивол 'c' не из таблицы ascii наверн я слажал, когда набирал. на англ ее замени

как я это понял даже не спрашивай
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 вне форума Ответить с цитированием
Старый 25.01.2012, 18:47   #13
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
ну cin видимо сам как то подчищает лишнее.
кстати, можно заметить, что у ostream метод flush есть, у istream нету ибо это не имеет смысла, как и fflush(sdtin). но вот микрософтовцы подумали, что прикольно будет и тут чистить буфер
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 вне форума Ответить с цитированием
Старый 25.01.2012, 20:46   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers
ну cin видимо сам как то подчищает лишнее.
кстати, можно заметить, что у ostream метод flush есть, у istream нету ибо это не имеет смысла, как и fflush(sdtin). но вот микрософтовцы подумали, что прикольно будет и тут чистить буфер
//где то в недрах istream
Код:
bool __CLR_OR_THIS_CALL _Ipfx(bool _Noskip = false)
		{	// test stream state and skip whitespace as needed
		if (ios_base::good())
			{	// state okay, flush tied stream and skip whitespace
			if (_Myios::tie() != 0)
				_Myios::tie()->flush();  // <----  смотрим сюда
Если пронаблюдать дальше:

Код:
virtual int __CLR_OR_THIS_CALL sync()
		{	// synchronize C stream with external file
		return (_Myfile == 0
			|| _Traits::eq_int_type(_Traits::eof(), overflow())
			|| 0 <= fflush(_Myfile) ? 0 : -1);  //<--- смотрим сюда
		}

Таким образом, студийный std::cin перед чтением чистит буфер ввода стандартным fflush(stdin)

А вы говорите, что это UB.

Вопрос: каким образом std::cin чистит буфер под линукс?
Как то же он должен это делать.
Неужели под разные платформы шандарахнули разные реализации istream ?
_Bers вне форума Ответить с цитированием
Старый 25.01.2012, 23:39   #15
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
Цитата:
_Myios::tie()->flush(); // <---- смотрим сюда
а теперь посмотри, что возвращает метод tie(). ога, ostream.

Цитата:
|| 0 <= fflush(_Myfile) ? 0 : -1); //<--- смотрим сюда
Цитата:
Таким образом, студийный std::cin перед чтением чистит буфер ввода стандартным fflush(stdin)
и что? микрософт решила, что их реализация fflush будет чистить буфер потока, открытого на чтение. вот они и пользуются этим. с их точки зрения никакого UB нет. но с точки зрения твоей программы он есть (явное исключение - твой софт пишется исключительно под вин).
Цитата:
Неужели под разные платформы шандарахнули разные реализации istream ?
не столько под разные платформы, как под разные компиляторы. каждый производитель компиля поставляет свою реализацию стандартной библиотеки (возможно какой то общий код есть). gcc - кросплатформенный компиль, поэтому старается лучше следовать стандартам. студийный компиль используется только в винде, где стандарты не особо соблюдаются.

Цитата:
Вопрос: каким образом std::cin чистит буфер под линукс?
Как то же он должен это делать.
я тебе предложил 2 варианта, как это можно сделать. какая разница, как в gcc это реализовано? мне не интересно. могу сказать, что в гццшном istream-e никакого вызова fflush нет. можешь открыть и посмотреть
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 вне форума Ответить с цитированием
Старый 26.01.2012, 00:02   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не забываем что istream имеет свой буфер, который и очищает.
на линухе думаю именно за счет этого и идет.

в винде же вроде не такие гибкие устройства терминала.(в линухе* это не только консоль сама)

*по умолчанию stdin настроен на буферизацию до перевода строки, то есть раньше чем перевод строки не вернет, а значит читается все сразу до перевода строки, в винде не видел такого у АПИ.

PS:+так же помним что в линухе как перевод строки применяется только #10, а не #13#10.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 26.01.2012 в 00:05.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает программа, что не так? Демик Паскаль, Turbo Pascal, PascalABC.NET 9 17.07.2011 21:12
Почему так!? pusik Помощь студентам 0 07.05.2011 20:53
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56
Почему так медленно работает цикл? zotox Общие вопросы C/C++ 3 09.01.2011 23:57
Почему так? Za_Stalina Свободное общение 14 16.12.2010 08:45