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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2012, 17:11   #1
Hall
 
Регистрация: 24.01.2012
Сообщений: 3
По умолчанию Почему так работает?

День добрый!
У меня вот такой вопрос:
Есть код - простой:
Код:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
void main(){
int m;
char a[10];

scanf("%d", &m);

 if (m==1){
 
 printf("hello \n");
 gets(a);
 printf("he");
 getch();
}
Он выдает сразу Hello
he
Не спрашивая 'a'.
А если код без if то все норм.
Код:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
void main(){

char a[10];
printf("hello \n");
 gets(a);
 printf("he");
 getch();

}
В чем проблема?) Как можно делать нормально в цикле или в отдельной функции?
Заранее спасибо.
Hall вне форума Ответить с цитированием
Старый 24.01.2012, 17:25   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Hall Посмотреть сообщение
Он выдает сразу Hello
he
Не спрашивая 'a'.
Читани темку: http://programmersforum.ru/showthread.php?t=184322
_Bers вне форума Ответить с цитированием
Старый 25.01.2012, 10:35   #3
Br0m
Пользователь
 
Регистрация: 25.01.2012
Сообщений: 13
По умолчанию

Работает.

Код:
#include <stdio.h>
#include <conio.h>

void main()
{
	int m;
	char a[10];

	scanf("%d", &m);

	if (m==1)
	{
		printf("hello \n");
		fflush(stdin); // очищаем буфер ввода
		gets(a);
		printf("he");
		getch();
	}
}
Br0m вне форума Ответить с цитированием
Старый 25.01.2012, 11:05   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Br0m
нельзя fflush применять к stdin. неопределенное поведение
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, 12:02   #5
Br0m
Пользователь
 
Регистрация: 25.01.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2Br0m
нельзя fflush применять к stdin. неопределенное поведение
это да, тогда может

scanf("%d%*c", &m);

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

2Br0m
Цитата:
while ((c = getchar()) != '\n' && c != EOF)
;
или
Цитата:
scanf("%*[^\n]%*с");
в реальных программах таких проблем не будет, ибо для пользовательского ввода никто не использует scanf("%d", &some_int). обычно читают строку с командами, ее уже парсят

http://c-faq.com/stdio/stdinflush2.html

2Br0m
Цитата:
scanf("%d%*c", &m);
ну от этого тоже мало толку. юзер введет 123qwe enter. в целочисленную переменную запишется 123, ты подавляешь q, we\n сидят в буфере.

я же предложил
Цитата:
scanf("%*[^\n]%*с");
подавить все, до \n + сам \n.

пс. не используй правку для изменения смысла постов
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

Последний раз редактировалось Stilet; 25.01.2012 в 22:02.
pproger вне форума Ответить с цитированием
Старый 25.01.2012, 14:18   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2Br0m
нельзя fflush применять к stdin. неопределенное поведение
С этого момента поподробнее, пожалуйста.
_Bers вне форума Ответить с цитированием
Старый 25.01.2012, 14:26   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
http://www.cplusplus.com/reference/c...cstdio/fflush/

Цитата:
If it was open for reading and the last operation was an input operation, the behavior depends on the specific library implementation. In some implementations this causes the input buffer to be cleared, but this is not standard behavior.
в винде, к примеру, fflush(stdin) очищает буфер, линухе нет
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, 14:51   #9
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
в винде, к примеру, fflush(stdin) очищает буфер, линухе нет
+1
(от оно чё, Михалыч... (с) )
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 25.01.2012, 15:50   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
_Bers
в винде, к примеру, fflush(stdin) очищает буфер, линухе нет
Пасип

У меня линукса нету под рукой. Проверить не получится.
Вот такой вопрос: если scanf заменить std::cin, и не делать никаких fflush, то он будет нормально считывать?

Код:
int main()
{
    float q; char c;
    std::cout<< "введите q: ";  std::cin >> q;
    std::cout<< "введите c: ";  std::cin >> c;
}
std::cin внутри себя (по крайней мере в студии) делает flush
Поэтому, проблем не возникает. И поведение такое, какое ожидается.

Если и под Линукс тоже проблем не возникает, тогда каким образом под линукс std::cin очищает буфер ввода?
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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