Проблема с буфером в С, getchar() не читает символ
Есть код:
#include <stdio.h>
int main(void) {
int guess = 1;
char response;
printf("Выберите целое число, в интервале от 1 до 100. Я попробую угадать его.\nНажмите клавишу у, если моя догадка верна"
" и клавишу n в противном случае.\n"
"==========================================================================\n");
printf("Вашим числом является %d ?\n", guess);
while ((response = getchar()) != 'y') {
if (response == 'n')
printf("Ладно, тогда это %d ?\n", ++guess);
else
printf("Принимаются только варианты y и n\n");
while ((response = getchar()) == '\n')
;
}
printf("Я знал что у меян получится!\n");
return 0;
}
Попытаюсь показать результат работы программы:
Выберите целое число, в интервале от 1 до 100. Я попробую угадать его.
Нажмите клавишу у, если моя догадка верна и клавишу n в противном случае.
==========================================================================
Вашим числом является 1 ?
n
Ладно, тогда это 2 ?
n
Принимаются только варианты y и n
Сперва программа требует ввод, вот я и ввожу n, далее getchar() её берет и присваивает переменной response, но в буфере ещё есть символ \n. Я далее есть внутренний цикл, который должен найти \n и прочитать и если это так, то ничего не делать. Но почему то внутренний цикл с функцией getchar(), не прочитала \n. Или же она её прочитала? Но тогда почему в внешнем цикле читается \n, а не n который я ввел и в итоге такой вывод
Принимаются только варианты y и n хотя я и ввел n. Можете пожалуйста мне это обяснить.
Ответы (2 шт):
while ((response = getchar()) != 'y')
if (response == '\n')
;
else if (response == 'n')
printf("Ладно, тогда это %d ?\n", ++guess);
else
printf("Принимаются только варианты y и n\n");
А можете мне прям объяснить то, из за чего у меня ошибка которую я описал выше?
getchar во вложенном while читает все переводы строк и следующий символ (выход из цикла когда условие ложно, значит он уже прочитал следующий символ), после чего getchar во внешнем цикле читает ещё 1 символ, который является переводом строки.
Если вместо y или n будешь вводить yy, nn или даже любой знак xy, qn, то твой код будет отвечать "нормально".
Сперва получается вводится n, далее по первому циклу это условие (response = getchar()) != 'y' и это истина т.к n != y и внутри внешнего цикла мы проверяем с помощью if если response == 'n' то все хорошо выводим то что надо т.е printf("Ладно, тогда это %d ?\n", ++guess);. И вот далее в буфере у нас остался символ \n, который внутренний цикл с помощью getchar() прочитал и по условию внешнего цикла response == '\n' или '\n' == \n' это истина поэтому цикл первую итерацию выполнил. Во теперь во второй итерации внутреннего цикла он читает символ второй строки a и этот символ под условие response == '\n' не подходит поэтому мы выходим из внутреннего цикла т.к условие неверное (или же нулевое) выходим из этого внутреннего цикла. А вот после символа a второй строки, опять же есть символ \n, который хавает getchar() во внешнем цикле с условием (response = getchar()) !='y'), которое оказывается верным т.к \n не равен y и вот внутри внешнего цикла условие if (response == 'n') не выполняется и поэтому выводится printf("Принимаются только варианты y и n\n");. Вот и всё.