Ich habe diesen Link bei Ссылка
gefundenzeigt "Wie kann ich mit std :: cin ungültige Eingabezeichen überspringen?"
%Vor%Ich kann nicht verstehen, wie es geht & gt; Kann jemand bitte erklären?
Ich habe Zweifel mit:
%Vor%Wie prüft es den gültigen Eintrag? Ich meine fragen Ausdrücke "std :: cout & lt; & lt;" Wie alt bist du? "Und"! (Std :: cin & gt; & gt; age) ", true oder false zurück, die UND-verknüpft sind?
Eine andere Sache, die verwirrend ist, ist die Verwendung,
%Vor% Was ist der Zweck? Bei diesen Funktionen habe ich nach google gesucht aber trotzdem bin ich nicht klar.
Insbesondere std::numeric_limits<std::streamsize>::max()
Kann jemand helfen? Danke
Die Einfüge- und Extraktionsoperatoren <<
und >>
für Streams geben einen Verweis auf den Stream selbst zurück. Deshalb können Sie Insertionen wie folgt aneinanderreihen:
Erstes std::cout << "Hello, "
gibt einen Verweis auf std::cout
zurück und dann haben Sie das Äquivalent von std::cout << "World!"
.
Die Streams können auch in bool
konvertiert werden. Dies überprüft grundsätzlich, ob der Zustand des Streams noch in Ordnung ist. Nichts ist gescheitert. Zum Beispiel könnten Sie dies tun:
Dies würde überprüfen, ob der std::cin
-Stream noch in einem guten Zustand ist.
Sehen wir uns jetzt den Code an, nach dem Sie gefragt haben:
%Vor% Das Einfügen in std::cout
verursacht keinen Fehler. Der einzige Grund, warum es hier enthalten ist, ist, dass es jedes Mal vor der Eingabe von age
auftritt. Die Alternative wäre, es einmal vor dem while
und einmal am Ende des while
Körpers zu platzieren.
Nach dem Einfügen in std::cout
wird !(std::cin >> age)
ausgewertet. Dadurch erhält der Benutzer zuerst einen age
. Dann können zwei Dinge passieren:
Wenn dies auf irgendeine Weise fehlschlägt (vielleicht gibt der Benutzer Zeichen anstelle einer Ganzzahl ein), wird das Fehlerbit gesetzt. Dies bedeutet, dass das Ergebnis von std::cin >> age
in ein bool
konvertiert wird, was false
ist. Das !
wird es in true
umkehren. Da sowohl die erste als auch die zweite Bedingung wahr waren, wird der Body der while
-Schleife ausgeführt, der Benutzer wird informiert, dass er einen ungültigen Wert eingegeben hat und die Schleife wird erneut durchlaufen.
Wenn die Eingabe erfolgreich ist, wird das Ergebnis von std::cin >> age
true
und !
wird es zu false
. Dies bedeutet, dass der Rumpf der while
-Schleife nicht ausgeführt wird und dem Benutzer nicht mitteilt, dass er den falschen Wert eingegeben hat.
Sehen wir uns nun an:
%Vor% Dies geschieht nur in Fall 1 oben, wenn die Eingabe fehlgeschlagen ist. Wenn ein Stream in einen Fehlerzustand übergeht, akzeptiert er keine weiteren Einfügungen oder Extraktionen mehr, bis der Status gelöscht wurde. Das macht clear()
. Dann sagt der Aufruf von ignore
, alle Zeichen bis einschließlich des nächsten \n
im Stream zu extrahieren und zu verwerfen. Dadurch wird die ungültige Eingabe aus dem Stream entfernt.
cout
ist ein globales Objekt der Klasse ostream
und cin
ist ein globales Objekt der Klasse istream
Diese Objekte werden entlang der überladenen Operatoren <<
(definiert in ostream
) und >>
(definiert in istream
) verwendet, um Eingaben zu erhalten (durch Aufruf der für diese Operatoren definierten Funktionen)
Der Rückgabetyp von operator<<
ist vom Typ ostream&
und der von operator>>
ist istream&
. Diese werden dann in boolesche Werte umgewandelt. Siehe dies .
Überprüfen dies auch für cin.ignore()
und cin.clear()
std::numeric_limits
können Sie die maximale Anzahl erhalten, die in einen bestimmten Typ passen kann.
In Ihrem Beispiel wird es an ignore()
function übergeben, was bedeutet, dass Sie jedes neue Zeichen im Voraus ignorieren.
As age
ist eine ganze Zahl
versucht, die Eingabe zu analysieren, um eine gültige Ganzzahl zu erhalten, wenn sie true zurückgeben kann, andernfalls wird false zurückgegeben.
Um mehr über cin.ignore
zu erfahren, wird es ..
Extrahiert und verwirft Zeichen aus dem Eingabestream bis und einschließlich delim.
Tags und Links c++