2017-02-09 23 views
0

Ich versuche, ein Beispielprogramm in C zu schreiben, das Benutzereingabe Zeichen für Zeichen liest, ohne dass der Benutzer die Eingabetaste drücken muss. Ich habe den Code gesehen here, und es funktioniert gut, mit einem kleinen Problem. Ich möchte alle Benutzereingaben verarbeiten, wenn sie die Eingabetaste drücken, und wenn ich system(/bin/stty raw); verwende, kann das Programm es nicht mehr erkennen. Wie in:Wie lese ich Benutzereingaben, bevor ich die Eingabetaste drücke?

int n, i; 
char buffer[50]; 
system ("/bin/stty raw"); 
for(i=0; i<30 ; i++) { 

    buffer[i] = getchar(); 
    printf("%d\n", buffer[i] == '\n'); //this prints 0 when I press enter 
    if(buffer[i] == '\n'){ 
     break; 
    } 
} 
printf("%s\n",buffer); 

system ("/bin/stty cooked"); 

Gibt es eine Möglichkeit zu erkennen, dass der Benutzer die Eingabetaste drückt, wenn er dies tut?

Was ich eigentlich versuche zu tun ist, die Eingabe des Benutzers zu lesen, bevor sie Enter drücken, aber etwas tun, wenn sie es tun. Eine andere Möglichkeit, dies zu tun, ist, wenn ich es nicht Zeichen für Zeichen lesen würde, sondern zB fgets(buffer, 255, stdin);, gibt es eine Möglichkeit, den Puffer von stdin zu lesen, bevor der Benutzer Enter drückt? Ich möchte die Eingabetaste dafür verwenden, so dass die Benutzereingabe auf ein anderes Zeichen, wie mit while((c=getchar())!= '.'){}, here beendet wird, ist keine Option.

+0

Haben Sie 'roh',' icrnl' und/oder 'inlcr' eingeschaltet? Diese beziehen sich auf die Zuordnung von CR zu NL ('\ r' zu' \ n') bei der Eingabe. Probieren Sie: 'system ("/bin/stty -a ");' in Ihrem Code - vielleicht sogar zweimal, einmal bevor Sie 'rohe' einschalten und einmal danach. Oder, mit anderen Worten, es gibt eine gute Chance, dass Sie '\ r' anstatt oder' 'n' 'abfangen müssen, wenn Sie im Rohmodus arbeiten. –

+0

Das ist alles Code. Wirklich, alles, was ich weggelassen habe, ist 'int main()' und 'return 0;' –

+0

Wenn du mich ansprichst, Luke, dann sage ich nicht, dass du mehr von einem MCVE erschaffen hättest. Ich sage Ihnen, dass der Befehl 'stty raw' viele Einstellungen in Ihrem Terminal verändert und dass einige davon mit der Konvertierung von CR (' \ r') in NL ('\ n') und umgekehrt zusammenhängen . Ich schlage auch vor, dass Sie experimentieren können, um die Einstellungen zu finden, bevor und nachdem Sie 'sty roh 'getan haben - was Ihnen helfen wird zu bestimmen, was sich geändert hat. Wie in der Antwort erwähnt, sollten Sie auch den Header POSIX '' und zugehörige Funktionen verwenden, um die Terminaleinstellungen direkter zu verwalten. –

Antwort

3

Die Terminaleinstellungen, die Sie mit stty raw deaktivieren, sind auch für die Harmonisierung von \r und \n verantwortlich.

Sie können stty -icanon min 1 verwenden, um nur die Pufferung zu deaktivieren, oder alternativ sowohl \r als auch \n als Eingabe akzeptieren.

PS: Es wird als gute Übung angesehen, die TCGETS/TCSETS ioctls zu verwenden, um die vorherigen Einstellungen zu ändern und erneut anzuwenden, anstatt stty aufzurufen und anschließend den gekochten Modus zu erzwingen.

+0

Sorry, aber das habe ich nicht ganz verstanden. Du meinst, ich sollte nach \ r statt \ n suchen? Wenn ja, ist das in Ordnung. Edit: Macht nichts, ich habe es versucht, und es funktioniert mit 'buffer [i] == '\ r'' –

Verwandte Themen