2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Katsotaanpa katsomaan klo CS50 kirjasto, 3 00:00:01,860 --> 00:00:05,190 erityisesti sen GetInt toiminto. 4 00:00:05,190 --> 00:00:07,820 Tässä meillä on todellinen lähde koodi GetInt. 5 00:00:07,820 --> 00:00:12,050 Ja huomaa, että se ei ole liian pitkä, ja suurin osa siitä muodostaa while-silmukka - 6 00:00:12,050 --> 00:00:15,620 päättymättömään silmukkaan tuohon - että vain palauttaa arvon, kun olemme todella 7 00:00:15,620 --> 00:00:17,400 saanut sitä, mitä odotimme. 8 00:00:17,400 --> 00:00:18,700 Katsotaanpa kulkea läpi. 9 00:00:18,700 --> 00:00:21,650 >> Huomaa täällä ensin, kun silmukka alkaa. 10 00:00:21,650 --> 00:00:25,390 Huomata seuraavaksi, että meillä on koodiriviä että itse asiassa vaatii getString, 11 00:00:25,390 --> 00:00:29,620 ja tallentaa tuotto arvo muuttuja, jota kutsutaan linja, tyypin merkkijono. 12 00:00:29,620 --> 00:00:31,210 Sitten tehdä vähän järki tarkistaa. 13 00:00:31,210 --> 00:00:35,770 Jos linja == null, sitten kumma palata INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Nyt on käynyt ilmi, että INT_MAX on erityistä jatkuvasti julisti muualla 15 00:00:40,140 --> 00:00:44,030 joka määrittää suurin mahdollinen int että voit edustavat 16 00:00:44,030 --> 00:00:45,160 ohjelma kuten tämä. 17 00:00:45,160 --> 00:00:49,430 Nyt olemme mielivaltaisesti päätti palata INT_MAX kuin Sentinel arvo 18 00:00:49,430 --> 00:00:53,120 lajittelee, joka olemme varattu eli on tapahtunut virhe. 19 00:00:53,120 --> 00:00:56,230 Joten hinta me maksamme, on tietenkin että GetInt voi ilmeisesti ole 20 00:00:56,230 --> 00:01:01,440 todella palata useita yhtä suuri kuin INT_MAX, sillä vaikka se haluaa, 21 00:01:01,440 --> 00:01:04,730 että paluu arvo olisi todella tulkitaan soittajan - 22 00:01:04,730 --> 00:01:06,260 kuka pääsee käyttämällä GetInt - 23 00:01:06,260 --> 00:01:09,340 koska virhe jonkinlaisia. 24 00:01:09,340 --> 00:01:13,840 >> Seuraavaksi huomaan, että olen julistanut int n ja char c. 25 00:01:13,840 --> 00:01:18,030 Tässä seuraavassa koodiriviä, kutsun toiminto nimeltään sscanf, ohimennen 26 00:01:18,030 --> 00:01:18,970 neljä argumenttia. 27 00:01:18,970 --> 00:01:25,110 line, joka on merkkijono käyttäjän kirjoitetaan, "% i% c", joka on muotoa 28 00:01:25,110 --> 00:01:28,850 merkkijono, joka Odotan käyttäjä voi tyyppi, jota seuraa osoite 29 00:01:28,850 --> 00:01:30,920 n, ja osoite c. 30 00:01:30,920 --> 00:01:34,860 Nyt sscanf n tarkoitus elämässä on todellakin skannata merkkijono etsii 31 00:01:34,860 --> 00:01:38,700 tietyssä muodossa, että ohjelmoija on määritellyt, että toinen väite. 32 00:01:38,700 --> 00:01:42,020 Tällöin% i on siellä, koska on% c. 33 00:01:42,020 --> 00:01:46,700 Joten jos sscanf kohtaa int vuonna käyttäjän syötteen, että int tallennetaan 34 00:01:46,700 --> 00:01:50,270 sisällä muuttuja nimeltä n, koska Olemme toimittaneet kolmanneksi 35 00:01:50,270 --> 00:01:52,810 argumentti sscanf osoitteen n. 36 00:01:52,810 --> 00:01:56,870 Mikä tarkoittaa, että sscanf voi todellakin mennä siellä, ja päivittää arvon siinä. 37 00:01:56,870 --> 00:01:59,990 >> Nyt, jos käyttäjä kirjoittaa jotain lisää 38 00:01:59,990 --> 00:02:01,220 kuin yksi tai useampi numeroa - 39 00:02:01,220 --> 00:02:03,570 toisin sanoen, char jonkinlainen - 40 00:02:03,570 --> 00:02:07,940 että toinen vaihteleva c, joiden osoite me johdetaan sscanf sen neljäs 41 00:02:07,940 --> 00:02:10,560 argumentti on myös asuttu. 42 00:02:10,560 --> 00:02:14,220 Nyt ylösalaisin tarkistaa lisäksi hahmo käyttäjä on 43 00:02:14,220 --> 00:02:17,360 että jos hän ei tee yhteistyötä, ja tyyppejä enemmän kuin vain int, 44 00:02:17,360 --> 00:02:20,530 pystymme havaitsemaan sitä tässä tavalla, koska siinä tapauksessa, sscanf 45 00:02:20,530 --> 00:02:24,860 aikoo palata 2, joka ilmoittaa, että molemmat Paikkamerkkien täyttyivät 46 00:02:24,860 --> 00:02:25,600 arvojen kanssa. 47 00:02:25,600 --> 00:02:30,360 Mutta toivomme, että sscanf sijaan palauttaa 1, mikä tarkoittaa, että käyttäjän tarvitsee vain 48 00:02:30,360 --> 00:02:31,630 edellyttäen int. 49 00:02:31,630 --> 00:02:34,480 >> Mitä teemme, jos sscanf todellakin palauttaa 1? 50 00:02:34,480 --> 00:02:39,150 No, me heti vapauttaa linja, että käyttäjä kirjoitettu, ja sitten me 51 00:02:39,150 --> 00:02:42,670 välittömästi palautettava n, jolla saanut int. 52 00:02:42,670 --> 00:02:47,180 Else, jos sscanf ei palaa 1, ja joten käyttäjä ei toiminut yhteistyössä, 53 00:02:47,180 --> 00:02:51,470 me vielä vapaana linja, mutta meidän nyt pyytää käyttäjää yritä uudelleen. 54 00:02:51,470 --> 00:02:55,390 Ja koska olemme yhä sisällä että muuten päättymättömään silmukkaan, prosessi 55 00:02:55,390 --> 00:03:00,190 alkaa uudelleen, ja ehkä uudelleen, ja ehkä uudelleen, ennen kuin käyttäjä todella 56 00:03:00,190 --> 00:03:01,500 tarjoaa meille int. 57 00:03:01,500 --> 00:03:21,490