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.
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. –