C ++ Beispiel: Nicht in der Lage zu verstehen, was getan wird?

8

Ich habe diesen Link bei Ссылка

gefunden

zeigt "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

    
Gaurav K 26.04.2013, 10:27
quelle

4 Antworten

10

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:

%Vor%

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:

%Vor%

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:

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

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

    
Joseph Mansfield 26.04.2013, 10:37
quelle
1
%Vor%

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()

    
Suvarna Pattayil 26.04.2013 10:41
quelle
0
Mit

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.

    
Bartek Banachewicz 26.04.2013 10:35
quelle
0

As age ist eine ganze Zahl

%Vor%

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.

    
deepmax 26.04.2013 10:32
quelle

Tags und Links