Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Проблема со scanf()ом


Автор: Shipa 26.10.2009, 14:52
Люди добрые, помогите мне, неумехе несчастному...
короче, есть прога на си:
Код

#include<stdio.h>
#include<stdlib.h>
int pumba(void)
{
int z;
float f1;
printf("\nVvedi chislo--->");
z=scanf("%f", &f1);
printf("%d",z);
(z != 0) ? printf("\nМолодец!"):printf("\nОсёл!");
return 0;
}
int main(void)
{
printf("_____________________________________________________");
int i;
for(i=0;i<5;i++)pumba();
printf("\nArrivedechi!\n");
printf("_____________________________________________________");
exit(0);
}

Оформить её можно поразному, суть не изменится. Программа проверяет ввод: число\буква.
Суть в том, что в отдельной программе процедура pumba выполнится идеально, но как только втыкаешь её в цикл, то начинаются жесткие лаги.....
Почему так происходит???
Что с этим делать??
вообще, надо создать простенькую фильтрацию входных данных, может это как-то по другому лучше делать??

Автор: bsa 26.10.2009, 15:26
легко. Сначала читаешь строку через fgets(buf, size_of_buffer, stdin), затем парсишь ее уже через sscanf.

Автор: Shipa 26.10.2009, 19:39
bsa, можно поподробнее, если можно, просто я слабо ориентируюсь в си пока что... 

Автор: XYZ010 26.10.2009, 19:52
А да к все понятно функции  то передать надо что то а вы ее пустую запускаете.
Код

void pumba()
{
int z;
float f1;
printf("\nVvedi chislo--->");
z=scanf("%f", &f1);
printf("%d",z);
(z != 0) ? printf("\nМолодец!"):printf("\nОсёл!");
}

вот так поппробуйте инициализировать

Автор: bsa 26.10.2009, 23:34
XYZ010, ты думаешь, что убрав возвращаемое значение что-то поменяется? А зря!

Shipa, что делает scanf() знаешь? Она читает стандартный ввод на предмет подходящих шаблону символов, затем парсит и записывает значение в переменную. Если попадаются некорректные символы, то они не забираются из потока, таким образом, следующая команда scanf опять их и считает. Чтобы этого не происходило, нужно сначала прочитать всю строку в буфер из стандартного ввода, а затем уже отправить на разбор. С буфером работает уже функция sscanf().

Автор: Anikmar 26.10.2009, 23:48
Попробуйте после scanf воткнуть fflush(stdin);

Автор: XYZ010 27.10.2009, 06:28
Цитата(bsa @ 26.10.2009,  23:34)
XYZ010, ты думаешь, что убрав возвращаемое значение что-то поменяется? А зря!



я не говорю о том что функция что то возвращает она у вас получает все что угодно. Зачем?

Автор: bsa 27.10.2009, 11:14
XYZ010, почитай книжку по Си. Что сейчас в С99, я не знаю, а раньше было так: f(void) - функция которая не принимает никакие параметры, а f() - функция, количество параметров которой не определено.. В С++ f(void) и f() - одно и тоже.

Автор: Shipa 28.10.2009, 15:41
всем спасибо, я разбил строку посимвольно ивсе ок! 

Автор: bsa 28.10.2009, 16:44
Цитата(Shipa @  28.10.2009,  15:41 Найти цитируемый пост)
всем спасибо, я разбил строку посимвольно ивсе ок!
мазохист...


M
bsa
Если ответ на вопрос получен, то пометь тему решенной.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)