2014-11-11 14 views
5

Ich bin neu in der Programmierung, und ich habe einige Fragen zu get() und getline() Funktionen in C++.Unterschied zwischen cin.get() und cin.getline()

Mein Verständnis für die beiden Funktionen:

Die getline() Funktion liest eine ganze Zeile, und das Newline-Zeichen durch die Enter-Taste übertragen mit dem Ende der Eingabe zu markieren. Die get()-Funktion ist ähnlich wie getline(), aber anstatt das Zeilenumbruchzeichen zu lesen und zu verwerfen, lässt get() dieses Zeichen in der Eingabewarteschlange.

Das Buch (C++ Primer Plus), das ich lese, schlägt vor, get() über getline() zu verwenden. Meine Verwirrung ist, dass es nicht getline() sicherer als get() ist, da es sicher ist, Linie mit '\n' zu beenden. Auf der anderen Seite wird get() hängt nur das Zeichen in der Eingabewarteschlange, wodurch möglicherweise ein Problem?

Antwort

10

Es gibt eine äquivalente Anzahl von Vor- und Nachteilen und - im Wesentlichen - alles hängt davon ab, was Sie gerade lesen: get() lässt das Trennzeichen in der Warteschlange, sodass Sie es als Teil der nächsten Eingabe betrachten können. getline() verwirft es, so dass die nächste Eingabe direkt danach sein wird.

Wenn Sie von einer Konsoleneingabe über das Newline-Zeichen sprechen, ist es sinnvoll, es zu verwerfen, aber wenn wir eine Eingabe aus einer Datei betrachten, können Sie als "Delimiter" den Anfang des nächsten Felds verwenden.

Was "gut" oder "sicher" zu tun ist, hängt davon ab, was Sie tun.

+0

Vielen Dank für Ihre Antwort, ich habe eine andere Frage in Bezug auf diese Angelegenheit. Was ist, wenn die Eingabezeichen die Zeichenbegrenzung für diese beiden Funktionen überschreiten, welche Art von Fehlern würde es möglicherweise verursachen? –

+1

@YuZhou Die maximale Anzahl von Zeichen, die vom Benutzer eingegeben werden können, ist 'std :: numeric_limits :: max()'. Wenn der Puffer des Streams nicht mehr genügend Speicher hat, wird das Fehler-Flag 'std :: ios_base :: badbit' gesetzt. – 0x499602D2

6

get() extrahiert Zeichen nach Zeichen aus einem Stream und gibt seinen Wert zurück (in eine ganze Zahl umgewandelt), während getline() verwendet wird, um Zeile für Zeile eine Zeile aus einer Datei abzurufen. Normalerweise wird getline verwendet, um Begrenzer in Anwendungen herauszufiltern, in denen Sie eine flache Datei (mit Tausenden von Zeilen) haben und die Ausgabe (zeilenweise) mit einem bestimmten Begrenzer extrahieren und dann eine Operation ausführen wollen.