Kurze Antwort
Warum? Weil im Eingabestream noch Leerzeichen (Zeilenumbrüche, Tabulatoren, Leerzeichen, Zeilenumbrüche) vorhanden sind.
Wann? Wenn Sie eine Funktion verwenden, die nicht alleine die führenden Leerzeichen ignoriert. Cin ignoriert und entfernt standardmäßig das führende Leerzeichen, aber getline ignoriert das führende Leerzeichen nicht alleine.
Nun eine ausführliche Antwort.
Alles, was Sie in die Konsole eingeben, wird aus dem Standard-Stream stdin gelesen. Wenn Sie etwas eingeben, sagen wir 256 in Ihrem Fall und drücken Sie die Eingabetaste, wird der Inhalt des Streams 256\n
. Jetzt nimmt cin 256 auf und entfernt sie aus dem Stream und \n
bleibt immer noch im Stream. Wenn Sie nun Ihren Namen eingeben, sagen wir Raddicus
, der neue Inhalt des Streams ist \nRaddicus
.
Jetzt kommt hier der Haken. Wenn Sie versuchen, eine Zeile mit getline zu lesen, liest getline standardmäßig bis zum Zeilenumbruchzeichen und entfernt das Zeilenumbruchzeichen aus dem Stream, wenn kein Trennzeichen als drittes Argument angegeben ist. Beim Aufrufen einer neuen Leitung liest und verwirft getline\n
aus dem Stream. dass eine leere Zeichenfolge in mystr gelesen wird, die so aussieht, als würde getline übersprungen (aber nicht), da bereits eine neue Zeile im Stream vorhanden war. Getline fordert Sie nicht zur Eingabe als auf es hat bereits gelesen, was es lesen sollte.
Wie hilft cin.ignore hier?
Laut der Ignorierdokumentation Auszug aus cplusplus.com -
istream & ignore (Streamsize n = 1, int delim = EOF);
Extrahiert Zeichen aus der Eingabesequenz und verwirft sie, bis entweder n Zeichen extrahiert wurden oder eines mit delim verglichen wird.
Die Funktion beendet auch das Extrahieren von Zeichen, wenn das Dateiende erreicht ist. Wenn dies vorzeitig erreicht wird (bevor entweder n Zeichen extrahiert oder Delim gefunden werden), setzt die Funktion das Eofbit-Flag.
Damit, cin.ignore(256, '\n');
ignoriert ersten 256 Zeichen oder alle Zeichen bis es trifft delimeter (hier \ n in Ihrem Fall), je nachdem , was zuerst eintritt (hier \ n ist das erste Zeichen, so dass es ignoriert , bis \ n angetroffen wird).
Nur als Referenz: Wenn Sie nicht genau wissen, wie viele Zeichen übersprungen werden sollen, und Ihr einziger Zweck darin besteht, den Stream zu löschen, um das Lesen einer Zeichenfolge mit getline oder cin vorzubereiten, sollten Sie diese verwenden cin.ignore(numeric_limits<streamsize>::max(),'\n')
.
Kurze Erklärung: Es werden die Zeichen ignoriert, die der maximalen Größe des Streams entsprechen oder bis ein '\ n' auftritt, je nachdem, welcher Fall zuerst eintritt.