" Как избежать нажатия 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.