" Как избежать нажатия Enterс помощью getchar()? "
Прежде всего, вход терминала обычно либо линейный, либо полностью буферизованный. Это означает, что операционная система сохраняет фактический ввод с терминала в буфер. Обычно этот буфер сбрасывается в программу, когда fe \nбыл сигнализирован / предоставлен в stdin. Это делается с помощью пресса Enter.
getchar()находится как раз в конце цепочки. У него нет возможности реально влиять на процесс буферизации.
" Как я могу это сделать? "
Ditchgetchar() в первую очередь, если вы не хотите использовать определенные системные вызовы , чтобы изменить поведение терминала явно , как хорошо объяснено в других ответах.
К сожалению, нет стандартной библиотечной функции и, следовательно, нет переносимого способа очистки буфера при вводе одного символа. Однако есть решения на основе реализации и непереносимые.
В Windows / MS-DOS, Есть getch()и getche()функции в conio.hфайле заголовка, которые делают точно , что вы хотите - читать один символ без необходимости ожидания для перехода на новую строку , чтобы очистить буфер.
Основное различие между getch()и getche()заключается в том getch(), что фактический входной символ не выводится сразу в консоль, в то время как это getche()делается. Дополнительные "e"расшифровываются как эхо .
Пример:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int c;
while ((c = getche()) != EOF)
{
if (c == '\n')
{
break;
}
printf("\n");
}
return 0;
}
В Linux, таким образом , чтобы получить непосредственную обработку и вывод символов заключается в использовании cbreak()и echo()вариантов и getch()и refresh()подпрограмм в Ncurses-библиотеке.
Обратите внимание, что вам необходимо инициализировать так называемый стандартный экран с помощью initscr()и закрыть то же самое с endwin()подпрограммами.
Пример:
#include <stdio.h>
#include <ncurses.h>
int main (void)
{
int c;
cbreak();
echo();
initscr();
while ((c = getch()) != ERR)
{
if (c == '\n')
{
break;
}
printf("\n");
refresh();
}
endwin();
return 0;
}
Примечание: вам нужно вызвать компилятор с -lncursesопцией, чтобы компоновщик мог искать и находить библиотеку ncurses.