2016-04-22 9 views
1

Also möchte ich die cin.ignore (200, '\ n') verwenden, um eine Zeile einzugeben und sie in eine Zeichenfolge zu speichern, ohne das \ n als Zeichenfolge zu speichern. Aber wenn ich das tue:Ignorieren des Eingabezeichens

cin.ignore(200,'\n'); 
getline(cin,name); 

Es fragt mich nach Eingang etwas zweimal, aber ich möchte mich nur einmal stellen und es in Namen zu speichern.

Ich habe etwas über das cin.clear() gelesen, aber ich denke, dass es nicht das ist, was ich brauche, oder vielleicht habe ich missverstanden, was das klar macht.

Danke!

+0

Es fragt Sie zweimal, weil Sie die erste Eingabe ignorieren. Warum brauchst du * ignore() * vor * getline() *? * getline() * liest das neue Zeilenzeichen trotzdem nicht in der Zeichenfolge. –

Antwort

2

cin.ignore(n, ch)verwirft Zeichen aus dem mit std::cin bis entweder n Zeichen zugeordnet Strom übersprungen worden ist, oder bis ch gesehen wird. Die cin.ignore(200, '\n'); verwerfen die erste Eingabe bis zu dem Newline-Zeichen. Sie erhalten dann eine Zeile, die Ihre zweite Eingabe akzeptiert.

Sie müssen möglicherweise die cin.ignore(n, ch); Konstrukt verwenden, wenn Sie eine Zeile unmittelbar nach lesen möchten Sie ein Leerzeichen getrennte Eingabeoperation durchführen, wie

int i = 0; 
std::cin >> i; // reads an integer, possibly leaving a '\n' in the stream 
std::cin.ignore(200, '\n'); // reads and discards until a newline is seen 
std::string name; 
std::getline(std::cin, name); // reads a full line 

In Ihrem Fall, wenn Sie nicht getan haben, Jeder whitespace-separated Eingang, der überspringt den ersten Versuch, Ihre Linieneingabe zur Verfügung zu stellen. Sie sollten einfach std :: getline sofort verwenden. Das Zeilenumbruchzeichen am Ende der Zeile ist nicht an die Zeichenfolge angehängt, aber es wird aus dem Eingabestream entfernt.

Die documentation for std::getline erklärt dies im Abschnitt "Hinweise".


Für eine robustere Line-Eingang Funktion, wo man nicht sicher sein kann, ob der vorherige Eingabevorgang eine neue Zeile Zeichen nach links (oder was auch immer Begrenzer Sie verwenden) auf dem Strom, Sie so etwas wie tun:

Die Elementfunktion peek gibt das nächste Zeichen zurück, das gelesen werden soll, ohne es aus dem Stream zu entfernen. Wenn es sich um eine Zeilenschaltung handelt, können Sie fortfahren und sie ignorieren. Ansonsten wird der getline Aufruf die gesamte Zeile lesen, einschließlich des Zeichens, das Sie gerade gesehen haben. Wenn Sie nur Leerräume verbrauchen möchten, können Sie alternativ den std::ws Manipulator verwenden.

+0

Ich denke, Sie haben einen Tippfehler in Ihrer Antwort * "std :: readline" *, ich denke, Sie wollten sagen * Std :: getline * und +1 für den alternativen Vorschlag. –

+0

@bkVnet Danke. Ich meinte tatsächlich 'std :: getline'! Entsprechend bearbeitet. – Andrew

+0

@bkVnet Also ... Was, wenn ich weiterlesen wollte ...? Stellen Sie sich vor, mein Code wäre etwa so: mit allem, was deklariert und enthalten ist. while (wahr) { getline (cin, name); cout << name << endl; } Wenn ich cin.ignore (100, '\ n') vor der While-Schleife hatte, würde es mich zunächst um eine Eingabe bitten, die ich nicht möchte ... – magalenyo

0

In diesem Fall müssen Sie ignore() nicht verwenden. getline() wird das neue Zeilenzeichen nicht in die Zeichenfolge einfügen.

Der sein Grund, warum Sie für eine Eingabe zweimal gefragt, weil die ignore() Funktion, bis die ersten Eingabe von Zeichen oder bis zum Newline (Ihr deliminator), so dass die nächsten getline() wahrscheinlich wird nichts ist das Entfernen so lesen fragen Sie für die Eingabe (es sei denn, Ihre erste Eingabe enthält mehr als 200 Zeichen, in diesem Fall wird es die verbleibenden Zeichen im Puffer lesen).

std::getline() das Begrenzer Zeichen der Zeichenfolge nicht hinzufügen, die gelesen wird, das ist die Newline-Zeichen standardmäßig.

Verwandte Themen