2 00:00:00,000 --> 00:00:01,860 >> Sprecher 1: Lassen Sie uns einen Blick an der CS50-Bibliothek, 3 00:00:01,860 --> 00:00:05,190 insbesondere seine GetInt Funktion. 4 00:00:05,190 --> 00:00:07,820 Hier haben wir die eigentliche Quelle Code für GetInt. 5 00:00:07,820 --> 00:00:12,050 Und feststellen, dass es nicht zu lange, und der größte Teil davon stellt eine while-Schleife - 6 00:00:12,050 --> 00:00:15,620 eine Endlosschleife an, dass - dass nur gibt einen Wert zurück, sobald wir eigentlich 7 00:00:15,620 --> 00:00:17,400 bekommen, was wir erwartet haben. 8 00:00:17,400 --> 00:00:18,700 Lassen Sie uns durch sie hindurchgehen. 9 00:00:18,700 --> 00:00:21,650 >> Beachten Sie hier zunächst die while-Schleife beginnt. 10 00:00:21,650 --> 00:00:25,390 Beachten Sie, dass wir neben einer Codezeile dass tatsächlich ruft GetString, 11 00:00:25,390 --> 00:00:29,620 und speichert den Rückgabewert in eine Variable, genannt Linie vom Typ String. 12 00:00:29,620 --> 00:00:31,210 Dann machen wir ein bisschen eine Plausibilitätsprüfung. 13 00:00:31,210 --> 00:00:35,770 Wenn Linie == null, dann werden wir neugierig zurück INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Jetzt stellt sich heraus, dass INT_MAX ist ein spezielle Konstante an anderer Stelle erklärt 15 00:00:40,140 --> 00:00:44,030 dass die größtmögliche gibt int, dass Sie in einem darstellen kann 16 00:00:44,030 --> 00:00:45,160 Programm wie dieses. 17 00:00:45,160 --> 00:00:49,430 Jetzt haben wir willkürlich entschieden zurück INT_MAX als Sentinelwert von 18 00:00:49,430 --> 00:00:53,120 Arten, eine, die wir als Vorbehalts was bedeutet, ist ein Fehler aufgetreten. 19 00:00:53,120 --> 00:00:56,230 Also der Preis, den wir zahlen, ist natürlich dass GetInt kann offenbar nicht 20 00:00:56,230 --> 00:01:01,440 tatsächlich eine Zahl so groß wie zurück INT_MAX, denn auch wenn es will, 21 00:01:01,440 --> 00:01:04,730 Rückgabewert sollte, dass wirklich vom Anrufer interpretiert werden - 22 00:01:04,730 --> 00:01:06,260 wer auch immer mit GetInt - 23 00:01:06,260 --> 00:01:09,340 als Fehler einiger sortieren. 24 00:01:09,340 --> 00:01:13,840 >> Als nächstes beachte, dass ich schon ein int n und ein char c. 25 00:01:13,840 --> 00:01:18,030 In der nächsten Zeile Code, ich nenne ein sscanf-Funktion aufgerufen, vorbei an 26 00:01:18,030 --> 00:01:18,970 vier Argumente. 27 00:01:18,970 --> 00:01:25,110 Linie, die die Zeichenfolge des Benutzers tippte in "% i% c", das ein Format ist 28 00:01:25,110 --> 00:01:28,850 String, den ich erwarte Der Benutzer kann Aktivität, gefolgt von der Adresse 29 00:01:28,850 --> 00:01:30,920 n, und die Adresse c. 30 00:01:30,920 --> 00:01:34,860 Jetzt sscanf der Sinn im Leben ist in der Tat um eine Zeichenfolge auf der Suche nach dem Scannen 31 00:01:34,860 --> 00:01:38,700 bestimmten Format, dass der Programmierer als dieser zweiten Argument angegeben. 32 00:01:38,700 --> 00:01:42,020 In diesem Fall ist% i dort, wie ist% c. 33 00:01:42,020 --> 00:01:46,700 Also, wenn ein int sscanf trifft in der Eingabe des Benutzers, wird dieser int gespeichert werden 34 00:01:46,700 --> 00:01:50,270 innerhalb der Variable n bezeichnet, weil haben wir als dritte bereitgestellt 35 00:01:50,270 --> 00:01:52,810 Argument, um die Adresse von n sscanf. 36 00:01:52,810 --> 00:01:56,870 Was bedeutet, dass sscanf kann in der Tat gehen dort, und aktualisieren Sie den Wert darin. 37 00:01:56,870 --> 00:01:59,990 >> Nun, im Fall der Benutzer in etwas mehr 38 00:01:59,990 --> 00:02:01,220 als eine oder mehrere Ziffern - 39 00:02:01,220 --> 00:02:03,570 in anderen Worten, ein Zeichen von einer Art - 40 00:02:03,570 --> 00:02:07,940 dass zweite Variable c, deren Adresse wir in sscanf als vierte geben 41 00:02:07,940 --> 00:02:10,560 Argument wird auch aufgefüllt werden. 42 00:02:10,560 --> 00:02:14,220 Jetzt ist der Kopf der Prüfung für ein zusätzliche Zeichen aus der Benutzer ist 43 00:02:14,220 --> 00:02:17,360 dass, wenn er oder sie nicht zusammenarbeiten, und Typen in mehr als nur ein int, 44 00:02:17,360 --> 00:02:20,530 wir in der Lage, es in diese zu erkennen Weise, weil in diesem Fall, sscanf 45 00:02:20,530 --> 00:02:24,860 wird sich zurück 2, was bedeutet, dass sowohl der Platzhalter gefüllt waren 46 00:02:24,860 --> 00:02:25,600 mit Werten. 47 00:02:25,600 --> 00:02:30,360 Aber wir hoffen, dass sscanf statt 1 zurückgibt, der nur den Benutzer bedeutet 48 00:02:30,360 --> 00:02:31,630 sofern ein int. 49 00:02:31,630 --> 00:02:34,480 >> Was tun wir, wenn sscanf in der Tat gibt 1 zurück? 50 00:02:34,480 --> 00:02:39,150 Nun, wir befreien sofort die Zeile, die der Benutzer eingetippt, und dann werden wir 51 00:02:39,150 --> 00:02:42,670 n sofort zurück, mit bekommen einen int. 52 00:02:42,670 --> 00:02:47,180 Andernfalls, wenn sscanf nicht wieder ein, und der Benutzer daher nicht kooperieren, 53 00:02:47,180 --> 00:02:51,470 befreien wir noch die Linie, aber wir der Benutzer jetzt nochmal zu versuchen aufzufordern. 54 00:02:51,470 --> 00:02:55,390 Und weil wir immer noch in der, dass Endlosschleife, der Prozess 55 00:02:55,390 --> 00:03:00,190 wieder neu zu beginnen, und vielleicht, und vielleicht wieder, bis der Benutzer tatsächlich 56 00:03:00,190 --> 00:03:01,500 bietet uns eine int. 57 00:03:01,500 --> 00:03:21,490