2012-04-07 11 views
17

Ich schreibe eine Funktion, die im Grunde darauf wartet, dass der Benutzer "Enter" drückt und dann etwas tut. Was ich gefunden habe, das funktioniert bei der Prüfung der unten:Lesen r (Wagenrücklauf) vs n (Newline) von der Konsole mit getc?

#include <stdio.h> 

int main() 
{ 
     int x = getc(stdin); 
     if (x == '\n') { 
       printf("carriage return"); 
       printf("\n"); 
     } 
     else { 
       printf("missed it"); 
       printf("\n"); 
     } 
} 

Die Frage, die ich habe, und was ich versuchte zunächst zu tun war: if (x == '\r') aber in Tests, hat das Programm fangen mich nicht schlagen ein. Die '\n' scheint zu entsprechen, dass ich von der Konsole aus trete. Kann jemand den Unterschied erklären? Um zu überprüfen, würde das Schreiben als if... == "\n" das Zeichenkettenliteral bedeuten? h. der Benutzer müsste wörtlich "\n" von der Konsole eingeben, richtig?

+0

Verbunden: http://stackoverflow.com/questions/1355095/what-is-the-difference-www.r-and-n – Mysticial

+1

C wendet Escapes sowohl auf Einzel- als auch auf doppelte Anführungszeichen an, also "\ n" ist string zwei Zeichen in der Länge, zuerst ASCII-Code 10 (\ n selbst) und zweitens - ASCII NUL (Null-Terminator). – toriningen

+1

(Ich hoffe, Sie haben nichts gegen die Änderungen am Titel, sie sind da, um es durchsuchbarer zu machen.) –

Antwort

26

\n ist das Newline-Zeichen, während \r der Wagenrücklauf ist. Sie unterscheiden sich darin, was sie benutzt. Windows verwendet \r\n, um anzugeben, dass die Eingabetaste gedrückt wurde, während Linux und Unix \n verwenden, um anzuzeigen, dass die Eingabetaste gedrückt wurde.

So würde ich immer \n verwenden, weil es von allen verwendet wird; und if (x == '\n') ist der richtige Weg, um die Zeichengleichheit zu testen.

13

Das '\ n' ist der 'Zeilenvorschub' und '\ r' ist der Wagenrücklauf. Verschiedene Betriebssysteme werden neue Linien in einer anderen Art und Weise handhaben, wie

Windows-

erwartet eine Newline-Kombination aus zwei Zeichen zu sein, ‚\ r \ n‘.

Linux \ Unix und Moderne Mac OS

Benutzt einen einzelnen '\ n' für eine neue Zeile.

Mac OS Classic

Benutzt einen einzelnen '\ r' für eine neue Zeile.

Grundsätzlich würde ich if (x == '\n') verwenden, wie es derzeit von allen modernen Betriebssystemen verwendet wird.

+0

Mac ist abhängig von der Version [Newline] (http://en.wikipedia.org/wiki/Newline). –

+3

Ich denke du meinst Classic Mac OS für '\' newline, da das moderne Mac OS X UNIX ist und '\ n' newline benutzt. – toriningen

+0

Sie sind beide richtig, ich hätte genauer sein sollen. – josephthomas

2

Denken Sie auch daran, dass bei Eingabe von 25 Zeichen und Eingabe die erste getc erst zurückkehrt, wenn alle 25 Zeichen eingegeben wurden und Sie die Eingabetaste drücken. Das Lesen eines Zeichens zum Zeitpunkt der Eingabe erfordert plattformspezifischen Code. Daher ist es besser, wenn Sie die gesamte Zeile lesen, indem Sie fgets in eine Zeichenfolge eingeben, die neue Zeile beschneiden und die Eingabezeile als Ganzes verarbeiten.

0

Mit gets() können Sie Puffer Überlauf Exploits und folglich möglicherweise Shell-Code-Angriffe Puffer. Sie sollten fgets() verwenden und eine Puffergröße übergeben.

+3

Dies sollte ein Kommentar und keine Antwort sein – Pranjal

0

Es gibt mehrere Abstraktionsebenen für die Darstellung einer neuen Zeile - die Laufzeit der Programmiersprache, der Texteditor und das Betriebssystem. CR (Wagenrücklauf) und LF (Zeilenvorschub) sind zwei Steuerzeichen, die in ASCII definiert sind. Bei einer anderen Kodierung des Charakters könnte auch ein Zeichen für eine "neue Zeile" definiert werden. Die Eingabetaste auf einer beliebigen Tastatur hat die Bedeutung "bis zum Anfang der nächsten Zeile". Die Tastatur entscheidet darüber, wie die Eingabetaste dem entsprechenden Steuerzeichen oder den entsprechenden Charaktern zugeordnet wird. Einige Tastatur unterscheidet auch Enter und Return-Taste - lassen Sie die Eingabetaste eine neue Zeile und Return-Taste sein Wagenrücklauf.In einer Standard-ANSI-Tastatur gibt es nur die Eingabetaste, die einem Wagenrücklauf-Zeichen (13) in ASCII zugeordnet ist. Dies ist also der eigentliche Inhalt, der vom Gerät an das Betriebssystem gesendet wird. Verschiedene Betriebssysteme entscheiden jedoch, die Eingabetaste anders zu interpretieren. In einem Unix-ähnlichen System wird also jeder Wagenrücklauf in einen Zeilenvorschub-Zeichensatz (10 in ASCII) übersetzt, bevor er an das Programm übergeben wird, das die Eingabe empfängt. Und unter Windows wird ein CR in zwei Characters übersetzt - ein CR gefolgt von einem LF. Sie können jedoch den Eingabestrom als Rohmodus festlegen. In diesem Fall erhält das Programm das, was die Tastatur tatsächlich sendet. Jetzt kommt der Editor ins Spiel. Wenn der Editor einen CR von stdin im Rohmodus erhält, weiß er, dass der CR der Eingabetaste auf der Tastatur entspricht (Annahme über die Tastatur) und er soll eine neue Zeile auf dem Bildschirm anzeigen. Im Raw-Modus sollte es den Schreibsystemaufruf aufrufen, um eine CR + LF auszugeben. Wenn sich der Ausgabestream nicht im unbearbeiteten Modus befindet, sollte der Texteditor die betriebssystemspezifische Sequenz wie LF unter Linux ausgeben.

Schließlich kann die Language Runtime die neue Zeile auch auf ihre eigene Art interpretieren. Zum Beispiel sagt der C-Standard: Beim Schreiben einer Datei im Textmodus wird '\ n' transparent in die vom System verwendete native Zeilenfolge übersetzt, die länger als ein Zeichen sein kann. Beim Lesen im Textmodus wird die native Newline-Sequenz zurück in '\ n' übersetzt. Im Binärmodus wird keine Übersetzung ausgeführt und die von '\ n' erzeugte interne Repräsentation wird direkt ausgegeben. Beachten Sie, dass "\ n" und "\ r" sprachspezifische Zeichen sind, die LF bzw. CR darstellen, die in C-ähnlichen Sprachen beliebt sind. Aber nicht jede Sprache muss diese Notation benutzen.

Für Ihre zweite Frage ist "\ n" '\ n' gefolgt von einem '\ 0' Terminator. Es gibt keine Möglichkeit, ein '\ 0' von der Konsole einzugeben.

Verwandte Themen