" Wie vermeide ich es, Entermit zu drücken getchar()
? "
Erstens ist der Terminaleingang üblicherweise entweder leitungsgebunden oder vollständig gepuffert. Dies bedeutet, dass das Betriebssystem die tatsächliche Eingabe vom Terminal in einem Puffer speichert. Normalerweise wird dieser Puffer in das Programm geleert, wenn zB \n
signalisiert / bereitgestellt wurde stdin
. Dies wird zB durch eine Presse gemacht Enter.
getchar()
ist gerade am Ende der Kette. Es ist nicht in der Lage, den Pufferungsprozess tatsächlich zu beeinflussen.
" Wie kann ich das machen? "
Ditchgetchar()
in erster Linie, wenn Sie keine spezifischen Systemaufrufe verwenden möchten, um das Verhalten des Terminals explizit zu ändern, wie in den anderen Antworten erläutert.
Es gibt leider keine Standardbibliotheksfunktion und damit keine tragbare Möglichkeit, den Puffer bei der Eingabe einzelner Zeichen zu leeren. Es gibt jedoch implementierungsbasierte und nicht portable Lösungen.
In Windows / MS-DOS gibt es die getch()
und getche()
-Funktionen in der conio.h
Header-Datei, die genau das tun, was Sie wollen - ein einzelnes Zeichen lesen, ohne darauf warten zu müssen, dass die neue Zeile den Puffer leert.
Der Hauptunterschied zwischen getch()
und getche()
besteht darin, dass getch()
das eigentliche Eingabezeichen in der Konsole nicht sofort ausgegeben wird, während dies der getche()
Fall ist. Das zusätzliche "e"
steht für Echo .
Beispiel:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int c;
while ((c = getche()) != EOF)
{
if (c == '\n')
{
break;
}
printf("\n");
}
return 0;
}
In Linux, eine Möglichkeit , direkte Zeichenverarbeitung und Ausgabe zu erhalten , ist es, die zu verwenden cbreak()
und echo()
Optionen und die getch()
und refresh()
Routinen in der ncurses-Bibliothek.
Beachten Sie, dass Sie den sogenannten Standardbildschirm mit dem initialisieren initscr()
und diesen mit den endwin()
Routinen schließen müssen.
Beispiel:
#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;
}
Hinweis: Sie müssen den Compiler mit der -lncurses
Option aufrufen , damit der Linker die ncurses-Bibliothek suchen und finden kann.