2 00:00:00,000 --> 00:00:01,860 >> HÖGTALARE 1: Låt oss ta en titt på CS50 biblioteket, 3 00:00:01,860 --> 00:00:05,190 specifikt dess getInt funktion. 4 00:00:05,190 --> 00:00:07,820 Här har vi den verkliga källan kod för getInt. 5 00:00:07,820 --> 00:00:12,050 Och märker att det inte är för lång, och mesta av den utgör en while-slinga - 6 00:00:12,050 --> 00:00:15,620 en oändlig loop på det - att endast returnerar ett värde när vi har faktiskt 7 00:00:15,620 --> 00:00:17,400 fått vad vi förväntat. 8 00:00:17,400 --> 00:00:18,700 Låt oss gå igenom det. 9 00:00:18,700 --> 00:00:21,650 >> Lägg märke till här uppe först, det medan slingan börjar. 10 00:00:21,650 --> 00:00:25,390 Lägg märke bredvid att vi har en rad kod som faktiskt kallar GetString, 11 00:00:25,390 --> 00:00:29,620 och lagrar det returnerade värdet i en variabel, kallad linje, av typen sträng. 12 00:00:29,620 --> 00:00:31,210 Vi gör sedan en bit av en sanity check. 13 00:00:31,210 --> 00:00:35,770 Om linje == null, då vi nyfiket återgå INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Nu visar det sig att INT_MAX är en speciell konstant deklareras annorstädes 15 00:00:40,140 --> 00:00:44,030 som anger den största möjliga int att du kan representera i en 16 00:00:44,030 --> 00:00:45,160 program som detta. 17 00:00:45,160 --> 00:00:49,430 Nu har vi godtyckligt valt att återvända INT_MAX som en vaktpost värde 18 00:00:49,430 --> 00:00:53,120 typer, en som vi har reserverat som vilket innebär ett fel har uppstått. 19 00:00:53,120 --> 00:00:56,230 Så det pris vi betalar, är naturligtvis att getInt kan uppenbarligen inte 20 00:00:56,230 --> 00:01:01,440 faktiskt tillbaka ett antal så stort som INT_MAX, för även om den vill, 21 00:01:01,440 --> 00:01:04,730 som returvärde borde verkligen tolkas av den som ringer - 22 00:01:04,730 --> 00:01:06,260 den som är med hjälp getInt - 23 00:01:06,260 --> 00:01:09,340 som ett fel av något slag. 24 00:01:09,340 --> 00:01:13,840 >> Därefter märker att jag har förklarat en int n och en röding c.. 25 00:01:13,840 --> 00:01:18,030 I detta nästa kodrad, kallar jag en Funktionen kallas sscanf, passerar 26 00:01:18,030 --> 00:01:18,970 fyra argument. 27 00:01:18,970 --> 00:01:25,110 linje, som är den sträng användarens skrivas in, "% i% c", som är ett format 28 00:01:25,110 --> 00:01:28,850 sträng som jag väntar användaren kan typ, följt av adressen till 29 00:01:28,850 --> 00:01:30,920 n, och adressen till c.. 30 00:01:30,920 --> 00:01:34,860 Nu sscanf s syfte i livet är verkligen att skanna en sträng söker den 31 00:01:34,860 --> 00:01:38,700 särskilt format att programmeraren har angetts som det andra argumentet. 32 00:01:38,700 --> 00:01:42,020 I detta fall är% i är i där, som är% c. 33 00:01:42,020 --> 00:01:46,700 Så om sscanf möter en int i användarens input, kommer att int lagras 34 00:01:46,700 --> 00:01:50,270 insidan av variabel kallad n, eftersom vi har gett som den tredje 35 00:01:50,270 --> 00:01:52,810 Argumentet att sscanf adressen n. 36 00:01:52,810 --> 00:01:56,870 Vilket betyder att sscanf faktiskt kan gå det, och uppdatera värdet däri. 37 00:01:56,870 --> 00:01:59,990 >> Nu, i fall användaren skriver i något mer 38 00:01:59,990 --> 00:02:01,220 än en eller flera siffror - 39 00:02:01,220 --> 00:02:03,570 med andra ord, en röding av något slag - 40 00:02:03,570 --> 00:02:07,940 den andra variabeln c, vars adress Vi gick in i sscanf som sin fjärde 41 00:02:07,940 --> 00:02:10,560 argument kommer också att befolkas. 42 00:02:10,560 --> 00:02:14,220 Nu uppsidan på sökning efter en ytterligare tecken från användaren är 43 00:02:14,220 --> 00:02:17,360 att om han eller hon inte samarbetar, och typer i mer än bara en int, 44 00:02:17,360 --> 00:02:20,530 Vi kommer att kunna upptäcka det i detta sätt, eftersom det i det fallet sscanf 45 00:02:20,530 --> 00:02:24,860 kommer att återvända 2, vilket innebär att båda platshållare fylldes 46 00:02:24,860 --> 00:02:25,600 med värden. 47 00:02:25,600 --> 00:02:30,360 Men vi hoppas att sscanf istället returnerar 1, vilket betyder att användaren endast 48 00:02:30,360 --> 00:02:31,630 förutsatt en int. 49 00:02:31,630 --> 00:02:34,480 >> Vad gör vi om sscanf verkligen returnerar 1? 50 00:02:34,480 --> 00:02:39,150 Tja, vi omedelbart befria den linje som användaren har skrivit in, och då vi 51 00:02:39,150 --> 00:02:42,670 omedelbart åter n, som har fått en int. 52 00:02:42,670 --> 00:02:47,180 Annars, om sscanf inte returnerar 1, och användaren därför inte samarbetade, 53 00:02:47,180 --> 00:02:51,470 vi fortfarande frigöra linjen, men vi nu uppmana användaren att försöka igen. 54 00:02:51,470 --> 00:02:55,390 Och eftersom vi är fortfarande inne i det annars oändlig slinga, processen 55 00:02:55,390 --> 00:03:00,190 kommer att börja igen, och kanske igen, och kanske igen, tills användaren faktiskt 56 00:03:00,190 --> 00:03:01,500 ger oss en int. 57 00:03:01,500 --> 00:03:21,490