У меня была похожая проблема сегодня, и я нашел способ, который, кажется, работает. Я не знаю деталей вашей ситуации, поэтому не знаю, сработает ли она для вас или нет.
Я пишу подпрограмму, которая должна получить один символ с клавиатуры, и это должно быть одно из трех определенных нажатий клавиш («1», «2» или «3»). Если это не один из них, программе необходимо отправить сообщение об ошибке и вернуться к нему еще раз.
Проблема в том, что в дополнение к вводимому мной символу, возвращаемому getchar (), нажатие клавиши «Ввод» (которая посылает нажатие клавиши в программу) сохраняется во входном буфере. Этот (непечатный) символ новой строки затем возвращается функцией getchar () в цикле исправления ошибок, что приводит к появлению второго сообщения об ошибке (поскольку символ новой строки не является ни «1», ни «2» , ни '3'.)
Проблема еще более усложняется, потому что я иногда забегаю вперед и вместо ввода одного символа я ввожу имя файла, которое будет запрашивать один из этих параметров. Затем в буфере появляется целая строка нежелательных символов, в результате чего длинный список сообщений об ошибках прокручивается по экрану.
Не круто.
Что, похоже, исправило это, так это:
c = getchar(); // get first char in line
while(getchar() != '\n') ; // discard rest of buffer
Первая строка - это та, которая фактически использует вводимый мной символ. Вторая строка избавляется от остатков во входном буфере. Он просто создает цикл, который одновременно извлекает символ из входного буфера. Там не указано действие, которое должно выполняться во время цикла оператора. Он просто читает символ и, если это не перевод строки, возвращается к следующему. Когда он находит новую строку, цикл заканчивается, и он переходит к следующему порядку работы в программе.