Ganze Zeilen und Eingaben mit Leerzeichen
std::cin >> name liest bei Text gewöhnlich nur bis zum nächsten Leerraum. Leerraum oder Whitespace umfasst Leerzeichen, Tabs und Zeilenumbrüche. Für einen Namen wie Ada Lovelace ist deshalb std::getline geeignet.
Ganze Zeilen und Eingaben mit Leerzeichen#
Ein- und Ausgabe · Lektion 10 von 60
Voraussetzungen: cin. Lernziel: Du liest vollständige Texte und prüfst ganze Zahlenzeilen.
std::cin >> name liest bei Text gewöhnlich nur bis zum nächsten Leerraum. Leerraum oder Whitespace umfasst Leerzeichen, Tabs und Zeilenumbrüche. Für einen Namen wie Ada Lovelace ist deshalb std::getline geeignet.
1#include <iostream>2#include <string>3 4int main() {5 std::string name;6 std::cout << "Vollstaendiger Name: ";7 if (!std::getline(std::cin, name)) {8 std::cerr << "Keine Eingabe verfuegbar.\n";9 return 1;10 }11 std::cout << "Hallo, " << name << "!\n";12}std::string ist der Standardtyp für veränderbaren Text aus <string>. getline liest bis zum Zeilenumbruch, entfernt diesen aus dem Stream und speichert ihn nicht im String. Eine gelesene leere Zeile ist etwas anderes als ein Eingabefehler.
Warum wird eine Zeile übersprungen?#
Nach std::cin >> alter kann der abschließende Zeilenumbruch im Stream liegen. Ein direkt folgendes getline findet ihn sofort und liefert leeren Text. Zwei Lösungen haben unterschiedliche Bedeutung:
std::getline(std::cin >> std::ws, name) verwirft jeglichen führenden Leerraum. Nutze das nur, wenn leere Zeilen und führende Leerzeichen nicht erhalten bleiben müssen.
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n') verwirft den Rest der aktuellen Zeile. Dafür brauchst du <limits>.
std::numeric_limits beschreibt Typgrenzen. std::streamsize ist ein Typ für Anzahlen im Stream-Umfeld. Bei einer fehlgeschlagenen vorherigen Eingabe musst du zuerst deren Fehler behandeln.
Vollständige Zahlenzeilen prüfen#
Ein Stringstream verarbeitet Daten in einem String statt unmittelbar an der Konsole. Mit std::istringstream aus <sstream> wertest du eine vorher gelesene Zeile aus.
1#include <iostream>2#include <sstream>3#include <string>4 5int main() {6 std::string zeile;7 if (!std::getline(std::cin, zeile)) {8 return 1;9 }10 std::istringstream eingabe{zeile};11 int zahl{};12 char rest{};13 if (!(eingabe >> zahl) || (eingabe >> rest)) {14 std::cerr << "Genau eine ganze Zahl erwartet.\n";15 return 1;16 }17 std::cout << "Gelesen: " << zahl << '\n';18}Nach der Zahl versucht das Programm ein weiteres Nicht-Leerraumzeichen zu lesen. Gelingt das, steht zusätzlicher Inhalt in der Zeile. 12abc wird abgelehnt, 12 akzeptiert. char ist ein Datentyp für eine schmale Codeeinheit, häufig ein einzelnes einfaches Zeichen. rest erkennt nur Zusatzinhalt.
Übung#
Welche Eingaben akzeptiert das zweite Programm: 12, 12 13, eine leere Zeile, 12x?
Lösung
Nur 12. Die leere Zeile enthält keine Zahl, die beiden anderen Eingaben enthalten zusätzliche Nicht-Leerraumzeichen.
Weiterlernen#
Zurück: Eingaben mit std::cin lesen und prüfen · Kursübersicht · Weiter: Manipulatoren: Zahlen und Tabellen formatieren
Kommentare 0
Kommentare sind für diese Seite deaktiviert.