2 00:00:00,000 --> 00:00:01,860 >> LUIDSPREKER 1: Laten we eens een kijkje nemen op CS50 bibliotheek 3 00:00:01,860 --> 00:00:05,190 specifiek zijn getInt functie. 4 00:00:05,190 --> 00:00:07,820 Hier hebben we de werkelijke bron code voor getint. 5 00:00:07,820 --> 00:00:12,050 En merk op dat het niet te lang, en het grootste deel vormt een tijdje loop - 6 00:00:12,050 --> 00:00:15,620 een oneindige lus dat - dat slechts geeft een waarde zodra we hebben eigenlijk 7 00:00:15,620 --> 00:00:17,400 gekregen wat we verwacht hadden. 8 00:00:17,400 --> 00:00:18,700 Laten we er doorheen lopen. 9 00:00:18,700 --> 00:00:21,650 >> Let hier eerst, de while loop begint. 10 00:00:21,650 --> 00:00:25,390 Merk vervolgens op dat we een regel code dat eigenlijk noemt GetString, 11 00:00:25,390 --> 00:00:29,620 en slaat de return waarde in een variabele, genaamd lijn, van het type string. 12 00:00:29,620 --> 00:00:31,210 We doen dan een beetje een sanity check. 13 00:00:31,210 --> 00:00:35,770 Als lijn == null, dan merkwaardig we terug INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Nu blijkt dat INT_MAX is een speciale constante elders verklaard 15 00:00:40,140 --> 00:00:44,030 dat de grootst mogelijke specificeert int dat u in een kan vertegenwoordigen 16 00:00:44,030 --> 00:00:45,160 programma als dit. 17 00:00:45,160 --> 00:00:49,430 Nu hebben we willekeurig besloten om terug te keren INT_MAX als een sentinel waarde van 18 00:00:49,430 --> 00:00:53,120 soorten, een die we hebben gereserveerd als wat betekent dat er een fout is opgetreden. 19 00:00:53,120 --> 00:00:56,230 Dus de prijs die we betalen, is natuurlijk dat getInt kan blijkbaar niet 20 00:00:56,230 --> 00:01:01,440 eigenlijk terug een aantal zo groot INT_MAX, want zelfs als het wil, 21 00:01:01,440 --> 00:01:04,730 die return waarde moet echt worden geïnterpreteerd door de beller - 22 00:01:04,730 --> 00:01:06,260 wie is het gebruik van getint - 23 00:01:06,260 --> 00:01:09,340 als een fout van een soort. 24 00:01:09,340 --> 00:01:13,840 >> Vervolgens merken dat ik heb verklaard een int n en een char c. 25 00:01:13,840 --> 00:01:18,030 In deze volgende regel code, noem ik een functie genaamd sscanf, passeren in 26 00:01:18,030 --> 00:01:18,970 vier argumenten. 27 00:01:18,970 --> 00:01:25,110 lijn, welke de tekenreeks de gebruiker getypt, "% i% c", hetgeen een formaat 28 00:01:25,110 --> 00:01:28,850 string die ik verwacht de gebruiker macht type, gevolgd door het adres 29 00:01:28,850 --> 00:01:30,920 n, en het adres van c. 30 00:01:30,920 --> 00:01:34,860 Nu sscanf's doel in het leven is inderdaad om een ​​string op zoek naar de scan 31 00:01:34,860 --> 00:01:38,700 bepaald formaat dat de programmeur heeft opgegeven als dat tweede argument. 32 00:01:38,700 --> 00:01:42,020 In dit geval,% i in daar, zoals% c. 33 00:01:42,020 --> 00:01:46,700 Dus als sscanf tegenkomt een int in de ingangsdeelnemer, zal dat int opgeslagen 34 00:01:46,700 --> 00:01:50,270 binnenzijde van de variabele genaamd n, omdat heeft geleverd als derde 35 00:01:50,270 --> 00:01:52,810 argument aan het adres van n sscanf. 36 00:01:52,810 --> 00:01:56,870 Wat betekent dat sscanf inderdaad kunnen gaan daar, en daarin werk de waarde. 37 00:01:56,870 --> 00:01:59,990 >> Nu, wanneer de gebruiker typt in iets meer 38 00:01:59,990 --> 00:02:01,220 dan een of meer cijfers - 39 00:02:01,220 --> 00:02:03,570 met andere woorden, een residu van een soort - 40 00:02:03,570 --> 00:02:07,940 die tweede variabele c, waarvan het adres we overgegaan in sscanf als vierde 41 00:02:07,940 --> 00:02:10,560 argument wordt ook bevolkt. 42 00:02:10,560 --> 00:02:14,220 Nu de kop van het controleren van een aanvullende karakter van de gebruiker is 43 00:02:14,220 --> 00:02:17,360 dat als hij of zij niet meewerkt, en soorten in meer dan alleen een int, 44 00:02:17,360 --> 00:02:20,530 we in staat zijn om het te ontdekken in deze wijze, omdat in dat geval, sscanf 45 00:02:20,530 --> 00:02:24,860 gaat terug 2, betekent dat zowel van de tijdelijke aanduidingen werden gevuld 46 00:02:24,860 --> 00:02:25,600 met waarden. 47 00:02:25,600 --> 00:02:30,360 Maar we hopen dat sscanf plaats retourneert 1, die alleen de gebruiker betekent 48 00:02:30,360 --> 00:02:31,630 mits een int. 49 00:02:31,630 --> 00:02:34,480 >> Wat doen we als sscanf inderdaad geeft 1? 50 00:02:34,480 --> 00:02:39,150 Nou, we vrij direct de lijn die de gebruiker ingetypt, en dan hebben we 51 00:02:39,150 --> 00:02:42,670 onmiddellijk terug te keren n, met gekregen een int. 52 00:02:42,670 --> 00:02:47,180 Want indien sscanf niet terugkeert 1, en de gebruiker dus geen medewerking, 53 00:02:47,180 --> 00:02:51,470 we vrij nog steeds de lijn, maar we Nu vraagt ​​de gebruiker om opnieuw te proberen. 54 00:02:51,470 --> 00:02:55,390 En omdat we nog steeds binnen van die anders oneindige lus, het proces 55 00:02:55,390 --> 00:03:00,190 zal weer opnieuw beginnen, en misschien, en misschien weer, totdat de gebruiker daadwerkelijk 56 00:03:00,190 --> 00:03:01,500 geeft ons een int. 57 00:03:01,500 --> 00:03:21,490