>> Sprecher 1: Lassen Sie uns einen Blick an der CS50-Bibliothek,
insbesondere seine GetInt Funktion.
Hier haben wir die eigentliche Quelle Code für GetInt.
Und feststellen, dass es nicht zu lange, und der größte Teil davon stellt eine while-Schleife -
eine Endlosschleife an, dass - dass nur gibt einen Wert zurück, sobald wir eigentlich
bekommen, was wir erwartet haben.
Lassen Sie uns durch sie hindurchgehen.
>> Beachten Sie hier zunächst die while-Schleife beginnt.
Beachten Sie, dass wir neben einer Codezeile dass tatsächlich ruft GetString,
und speichert den Rückgabewert in eine Variable, genannt Linie vom Typ String.
Dann machen wir ein bisschen eine Plausibilitätsprüfung.
Wenn Linie == null, dann werden wir neugierig zurück INT_MAX.
>> Jetzt stellt sich heraus, dass INT_MAX ist ein spezielle Konstante an anderer Stelle erklärt
dass die größtmögliche gibt int, dass Sie in einem darstellen kann
Programm wie dieses.
Jetzt haben wir willkürlich entschieden zurück INT_MAX als Sentinelwert von
Arten, eine, die wir als Vorbehalts was bedeutet, ist ein Fehler aufgetreten.
Also der Preis, den wir zahlen, ist natürlich dass GetInt kann offenbar nicht
tatsächlich eine Zahl so groß wie zurück INT_MAX, denn auch wenn es will,
Rückgabewert sollte, dass wirklich vom Anrufer interpretiert werden -
wer auch immer mit GetInt -
als Fehler einiger sortieren.
>> Als nächstes beachte, dass ich schon ein int n und ein char c.
In der nächsten Zeile Code, ich nenne ein sscanf-Funktion aufgerufen, vorbei an
vier Argumente.
Linie, die die Zeichenfolge des Benutzers tippte in "% i% c", das ein Format ist
String, den ich erwarte Der Benutzer kann Aktivität, gefolgt von der Adresse
n, und die Adresse c.
Jetzt sscanf der Sinn im Leben ist in der Tat um eine Zeichenfolge auf der Suche nach dem Scannen
bestimmten Format, dass der Programmierer als dieser zweiten Argument angegeben.
In diesem Fall ist% i dort, wie ist% c.
Also, wenn ein int sscanf trifft in der Eingabe des Benutzers, wird dieser int gespeichert werden
innerhalb der Variable n bezeichnet, weil haben wir als dritte bereitgestellt
Argument, um die Adresse von n sscanf.
Was bedeutet, dass sscanf kann in der Tat gehen dort, und aktualisieren Sie den Wert darin.
>> Nun, im Fall der Benutzer in etwas mehr
als eine oder mehrere Ziffern -
in anderen Worten, ein Zeichen von einer Art -
dass zweite Variable c, deren Adresse wir in sscanf als vierte geben
Argument wird auch aufgefüllt werden.
Jetzt ist der Kopf der Prüfung für ein zusätzliche Zeichen aus der Benutzer ist
dass, wenn er oder sie nicht zusammenarbeiten, und Typen in mehr als nur ein int,
wir in der Lage, es in diese zu erkennen Weise, weil in diesem Fall, sscanf
wird sich zurück 2, was bedeutet, dass sowohl der Platzhalter gefüllt waren
mit Werten.
Aber wir hoffen, dass sscanf statt 1 zurückgibt, der nur den Benutzer bedeutet
sofern ein int.
>> Was tun wir, wenn sscanf in der Tat gibt 1 zurück?
Nun, wir befreien sofort die Zeile, die der Benutzer eingetippt, und dann werden wir
n sofort zurück, mit bekommen einen int.
Andernfalls, wenn sscanf nicht wieder ein, und der Benutzer daher nicht kooperieren,
befreien wir noch die Linie, aber wir der Benutzer jetzt nochmal zu versuchen aufzufordern.
Und weil wir immer noch in der, dass Endlosschleife, der Prozess
wieder neu zu beginnen, und vielleicht, und vielleicht wieder, bis der Benutzer tatsächlich
bietet uns eine int.