Re[10]: Использование printf() и scanf()
От: ansi  
Дата: 15.06.05 12:36
Оценка:
Здравствуйте, Eugenio, Вы писали:

E>>>Я имею ввиду, что после первого вызова scanf("%[NnYy]",) и ввода юзером 1 (одного) символа,

E>>>повторный вызов scanf с теми же параметрами не работает:
E>>>программа проходит этот кусок и завершается, не принимая ввода от юзера.
E>>>Это может объясняться наличием в буфере еще не считанных символов, но их там НЕТ!

A>>Во-первых, в твоей программе вызов scanf("%[NnYy]", &inp) только один. После него идет scanf("%f", ...).


E>См. в конце этого куска кода — очередной вопрос (printf) и вызов scanf с теми же параметрами, что и в первый раз.

E>Если ввести 'n' в первый раз, то вызова scanf("%f", ..) не последует, так? Так.
E>И управление сразу передастся туда, где задается второй вопрос.
E>Так вот, второй вопрос прога задает, но ввода прога не ждет. Не могу понять, какого..? В рабочей-то проге я уже сделал всё (getchar()), но я не понимаю, что ЗДЕСЬ не так!

Теперь понятно:
scanf("%c", &c);
scanf("%c", &c);


После ввода 'y' + Enter, c будет содержать символ перевода строки (10)... scanf — это чудо Кстати, getchar — это те же яйца, только в профиль. Вот функция _getche реально с консоли читает один символ, но это приблуда микрософта. Есть еще одна приблуда микрософта — _flushall. Если будешь вызывать после каждого scanf, то она будет чистить внутренний буфер и проблем не будет.

Короче, если есть возможность — используй заплюсованные потоки, они слава богу продуманы получше.

Если нет возможности, то можно сделать такие хитрожопые обертки:

char my_read_char() {

   char buff[3];

   fgets(buff, 2, stdin);
   return buff[0];

}



#define MAX_FLOAT_STRLEN 15

int my_read_float(float *f) {

   char buff[MAX_FLOAT_STRLEN];
     
   fgets(buff, MAX_FLOAT_STRLEN - 1, stdin);
   return sscanf(buff, "%f", f);
}
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Apocalyptica — Nothing Else Matters";
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.