2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Lad os tage et kig på CS50 bibliotek, 3 00:00:01,860 --> 00:00:05,190 specielt dens GetInt funktion. 4 00:00:05,190 --> 00:00:07,820 Her har vi den egentlige kilde kode for GetInt. 5 00:00:07,820 --> 00:00:12,050 Og bemærk, at det ikke er for lang, og det meste af det udgør en while-løkke - 6 00:00:12,050 --> 00:00:15,620 en uendelig løkke, der - som kun returnerer en værdi, når vi har faktisk 7 00:00:15,620 --> 00:00:17,400 fået hvad vi forventede. 8 00:00:17,400 --> 00:00:18,700 Lad os gå igennem det. 9 00:00:18,700 --> 00:00:21,650 >> Bemærk op her først, mens løkken begynder. 10 00:00:21,650 --> 00:00:25,390 Bemærk næste, at vi har en linje kode der faktisk opfordrer getString, 11 00:00:25,390 --> 00:00:29,620 og gemmer returværdien i en variabel, kaldet linje af typen string. 12 00:00:29,620 --> 00:00:31,210 Vi så gøre lidt af et sanity check. 13 00:00:31,210 --> 00:00:35,770 Hvis linje == null, så vi nysgerrigt tilbage INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Nu viser det sig, at INT_MAX er en særlig konstant erklæret andetsteds 15 00:00:40,140 --> 00:00:44,030 , der angiver den størst mulige int, at du kan repræsentere i en 16 00:00:44,030 --> 00:00:45,160 program som dette. 17 00:00:45,160 --> 00:00:49,430 Nu har vi vilkårligt besluttet at vende tilbage INT_MAX som en skildvagt værdi på 18 00:00:49,430 --> 00:00:53,120 slags, som vi har reserveret som er opstået betyder en fejl. 19 00:00:53,120 --> 00:00:56,230 Så den pris, vi betaler, er naturligvis at GetInt kan tilsyneladende ikke 20 00:00:56,230 --> 00:01:01,440 faktisk returnere en tal så stor som INT_MAX, fordi selv hvis det ønsker at, 21 00:01:01,440 --> 00:01:04,730 at returværdi burde virkelig fortolkes af den, der ringer - 22 00:01:04,730 --> 00:01:06,260 hvem er ved hjælp af GetInt - 23 00:01:06,260 --> 00:01:09,340 som en fejl af en slags. 24 00:01:09,340 --> 00:01:13,840 >> Dernæst mærke til, at jeg har erklæret en int n og en char c. 25 00:01:13,840 --> 00:01:18,030 I denne næste linje kode, jeg kalder en funktion kaldet sscanf, der passerer i 26 00:01:18,030 --> 00:01:18,970 fire argumenter. 27 00:01:18,970 --> 00:01:25,110 linje, der er den streng brugerens indtastet, "% i% c", som er et format 28 00:01:25,110 --> 00:01:28,850 streng, som jeg forventer at brugeren måske typen, efterfulgt af adressen 29 00:01:28,850 --> 00:01:30,920 n, og adressen på ca. 30 00:01:30,920 --> 00:01:34,860 Nu sscanf formål i livet er faktisk at scanne en streng på udkig efter den 31 00:01:34,860 --> 00:01:38,700 bestemt format at programmøren har angivet som det andet argument. 32 00:01:38,700 --> 00:01:42,020 I dette tilfælde% i er i der, som er% ca. 33 00:01:42,020 --> 00:01:46,700 Så hvis sscanf støder en int i brugerens input, vil denne int lagres 34 00:01:46,700 --> 00:01:50,270 indersiden af ​​variablen n, fordi vi har givet som den tredje 35 00:01:50,270 --> 00:01:52,810 argument for at sscanf adressen n. 36 00:01:52,810 --> 00:01:56,870 Hvilket betyder, at sscanf faktisk kan gå der, og opdatere værdien deri. 37 00:01:56,870 --> 00:01:59,990 >> Nu, i tilfælde af at brugeren typer i noget mere 38 00:01:59,990 --> 00:02:01,220 end én eller flere cifre - 39 00:02:01,220 --> 00:02:03,570 med andre ord, en char af en slags - 40 00:02:03,570 --> 00:02:07,940 at anden variabel c, hvis adresse vi gik ind sscanf som sin fjerde 41 00:02:07,940 --> 00:02:10,560 argument vil også blive befolket. 42 00:02:10,560 --> 00:02:14,220 Nu opadrettede af kontrol for en yderligere tegn fra brugeren 43 00:02:14,220 --> 00:02:17,360 at hvis han eller hun ikke samarbejder, og typer i mere end blot en int, 44 00:02:17,360 --> 00:02:20,530 vi vil være i stand til at opdage det i dette måde, fordi der i så fald sscanf 45 00:02:20,530 --> 00:02:24,860 kommer til at returnere 2, hvilket signalerer, at begge pladsholdere blev fyldt 46 00:02:24,860 --> 00:02:25,600 med værdier. 47 00:02:25,600 --> 00:02:30,360 Men vi håber, at sscanf stedet returnerer 1, hvilket betyder, at brugeren kun 48 00:02:30,360 --> 00:02:31,630 forudsat en int. 49 00:02:31,630 --> 00:02:34,480 >> Hvad gør vi, hvis sscanf faktisk returnerer 1.? 50 00:02:34,480 --> 00:02:39,150 Nå, vi straks befri den linje, brugeren har skrevet i, og så vi 51 00:02:39,150 --> 00:02:42,670 øjeblikkeligt returnere n, der fået en int. 52 00:02:42,670 --> 00:02:47,180 Else, hvis sscanf ikke vender tilbage 1, og brugeren derfor ikke samarbejder, 53 00:02:47,180 --> 00:02:51,470 vi stadig slippe linjen, men vi nu bede brugeren om at prøve igen. 54 00:02:51,470 --> 00:02:55,390 Og fordi vi er stadig inde i det ellers uendelig løkke, processen 55 00:02:55,390 --> 00:03:00,190 vil begynde igen og måske igen, og måske igen, indtil brugeren faktisk 56 00:03:00,190 --> 00:03:01,500 giver os en int. 57 00:03:01,500 --> 00:03:21,490