„ Jak uniknąć naciskania Enterz getchar()
? ”
Po pierwsze, wejście terminala jest zwykle liniowe lub w pełni buforowane. Oznacza to, że system operacyjny przechowuje rzeczywiste dane wejściowe z terminala do bufora. Zwykle ten bufor jest opróżniany do programu, gdy fe \n
został zasygnalizowany / dostarczony w stdin
. Jest to na przykład wykonane przez prasę Enter.
getchar()
znajduje się na końcu łańcucha. Nie ma możliwości faktycznego wpływania na proces buforowania.
„ Jak mogę to zrobić? ”
Rówgetchar()
w pierwszej kolejności, czy Do not chcesz używać konkretnych wywołań systemowych, aby zmienić zachowanie terminala wyraźnie jak dobrze wyjaśnione w innych odpowiedzi.
Niestety nie ma standardowej funkcji bibliotecznej, a tym samym nie ma przenośnego sposobu na opróżnienie bufora przy wprowadzaniu pojedynczego znaku. Istnieją jednak rozwiązania oparte na implementacji i nieprzenośne.
W systemie Windows / MS-DOS w pliku nagłówkowym znajdują się funkcje getch()
i , które robią dokładnie to, co chcesz - odczytują pojedynczy znak bez potrzeby czekania, aż nowa linia opróżni bufor.getche()
conio.h
Główna różnica między getch()
i getche()
polega na tym, getch()
że nie wyświetla natychmiast rzeczywistego znaku wejściowego w konsoli, podczas gdy getche()
tak. Dodatkowe "e"
oznacza echo .
Przykład:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int c;
while ((c = getche()) != EOF)
{
if (c == '\n')
{
break;
}
printf("\n");
}
return 0;
}
W Linuksie, sposób uzyskania bezpośredniego przetwarzania znaków i wyjście jest wykorzystanie cbreak()
i echo()
opcje i tym getch()
i refresh()
procedury w bibliotece ncurses.
Zauważ, że musisz zainicjować tak zwany ekran standardowy za pomocą initscr()
i zamknąć to samo z endwin()
procedurami.
Przykład:
#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;
}
Uwaga: Musisz wywołać kompilator z -lncurses
opcją, aby konsolidator mógł przeszukać i znaleźć bibliotekę ncurses.