Здравствуйте, 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";