2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: La oss ta en titt på CS50 bibliotek, 3 00:00:01,860 --> 00:00:05,190 spesielt dens GetInt funksjon. 4 00:00:05,190 --> 00:00:07,820 Her har vi selve kilden kode for GetInt. 5 00:00:07,820 --> 00:00:12,050 Og legg merke til at det ikke er for lang, og det meste av det som utgjør en while-loop - 6 00:00:12,050 --> 00:00:15,620 en uendelig løkke på det - at bare returnerer en verdi når vi har faktisk 7 00:00:15,620 --> 00:00:17,400 fått hva vi forventet. 8 00:00:17,400 --> 00:00:18,700 La oss gå gjennom den. 9 00:00:18,700 --> 00:00:21,650 >> Legg merke seg her først, mens loop begynner. 10 00:00:21,650 --> 00:00:25,390 Legg merke til neste at vi har en linje med kode som faktisk kaller GetString, 11 00:00:25,390 --> 00:00:29,620 og lagrer returverdien i en variable, kalt linje, av typen streng. 12 00:00:29,620 --> 00:00:31,210 Vi gjør deretter en bit av en mental helse sjekk. 13 00:00:31,210 --> 00:00:35,770 Hvis linjen == null, så vi merkelig returnere INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Nå viser det seg at INT_MAX er en spesiell konstant erklært andre steder 15 00:00:40,140 --> 00:00:44,030 som angir størst mulig int at du kan representere i en 16 00:00:44,030 --> 00:00:45,160 program som dette. 17 00:00:45,160 --> 00:00:49,430 Nå har vi vilkårlig besluttet å gå tilbake INT_MAX som en sentinel verdien av 18 00:00:49,430 --> 00:00:53,120 slag, en som vi har reservert som noe som betyr en feil har oppstått. 19 00:00:53,120 --> 00:00:56,230 Så prisen vi betaler, selvfølgelig, er at GetInt kan tydeligvis ikke 20 00:00:56,230 --> 00:01:01,440 faktisk returnere et tall så stort som INT_MAX, fordi selv om den ønsker å, 21 00:01:01,440 --> 00:01:04,730 at returverdien burde virkelig tolkes av den som ringer - 22 00:01:04,730 --> 00:01:06,260 hvem som brukar GetInt - 23 00:01:06,260 --> 00:01:09,340 som en feil av noe slag. 24 00:01:09,340 --> 00:01:13,840 >> Neste, merker at jeg har erklært en int n og en char c. 25 00:01:13,840 --> 00:01:18,030 I denne neste linje med kode, kaller jeg en funksjon kalt sscanf, passerer i 26 00:01:18,030 --> 00:01:18,970 fire argumenter. 27 00:01:18,970 --> 00:01:25,110 linje, som er strengen brukerens skrevet i, "% i% c", som er et format 28 00:01:25,110 --> 00:01:28,850 streng som jeg forventer at brukeren makt type, etterfulgt av adressen 29 00:01:28,850 --> 00:01:30,920 n, og adressen til ca. 30 00:01:30,920 --> 00:01:34,860 Nå sscanf formål i livet er virkelig å skanne en streng på jakt etter den 31 00:01:34,860 --> 00:01:38,700 bestemt format som programmerer har spesifisert som det andre argumentet. 32 00:01:38,700 --> 00:01:42,020 I dette tilfelle er% i i der, er% c som. 33 00:01:42,020 --> 00:01:46,700 Så hvis sscanf møter en int i brukerens innmating, vil den int lagres 34 00:01:46,700 --> 00:01:50,270 innsiden av variabel kalt n, fordi vi har gitt som den tredje 35 00:01:50,270 --> 00:01:52,810 argument for å sscanf adressen til n. 36 00:01:52,810 --> 00:01:56,870 Hvilket betyr at sscanf kan faktisk gå der, og oppdatere verdien i dette. 37 00:01:56,870 --> 00:01:59,990 >> Nå, i tilfelle brukeren skriver i noe mer 38 00:01:59,990 --> 00:02:01,220 enn ett eller flere sifre - 39 00:02:01,220 --> 00:02:03,570 med andre ord, en røye av noe slag - 40 00:02:03,570 --> 00:02:07,940 at andre variable c, som har en adresse vi gått inn sscanf som sin fjerde 41 00:02:07,940 --> 00:02:10,560 argumentet vil også bli befolket. 42 00:02:10,560 --> 00:02:14,220 Nå oppsiden av å sjekke for en ekstra karakter fra brukeren er 43 00:02:14,220 --> 00:02:17,360 at hvis han eller hun ikke samarbeider, og typer i mer enn bare en int, 44 00:02:17,360 --> 00:02:20,530 vi vil være i stand til å oppdage det i dette måte, fordi i så fall, sscanf 45 00:02:20,530 --> 00:02:24,860 kommer til å vende tilbake 2, som viser at både av plassholderne ble fylt 46 00:02:24,860 --> 00:02:25,600 med verdier. 47 00:02:25,600 --> 00:02:30,360 Men vi håper at sscanf stedet returnerer 1, som betyr at brukeren bare 48 00:02:30,360 --> 00:02:31,630 gitt en int. 49 00:02:31,630 --> 00:02:34,480 >> Hva gjør vi hvis sscanf faktisk returnerer en? 50 00:02:34,480 --> 00:02:39,150 Vel, vi umiddelbart frigjøre linjen som brukeren har skrevet inn, og da vi 51 00:02:39,150 --> 00:02:42,670 umiddelbart returnere n, ha fått en int. 52 00:02:42,670 --> 00:02:47,180 Else, hvis sscanf ikke returnerer en, og brukeren derfor ikke samarbeidet, 53 00:02:47,180 --> 00:02:51,470 vi fortsatt frigjøre linjen, men vi nå be brukeren om å prøve på nytt. 54 00:02:51,470 --> 00:02:55,390 Og fordi vi er fortsatt inne i det ellers uendelig loop, prosessen 55 00:02:55,390 --> 00:03:00,190 begynner på nytt, og kanskje igjen, og kanskje igjen, inntil brukeren faktisk 56 00:03:00,190 --> 00:03:01,500 gir oss en int. 57 00:03:01,500 --> 00:03:21,490