>> HÖGTALARE 1: Låt oss ta en titt på CS50 biblioteket,
specifikt dess getInt funktion.
Här har vi den verkliga källan kod för getInt.
Och märker att det inte är för lång, och mesta av den utgör en while-slinga -
en oändlig loop på det - att endast returnerar ett värde när vi har faktiskt
fått vad vi förväntat.
Låt oss gå igenom det.
>> Lägg märke till här uppe först, det medan slingan börjar.
Lägg märke bredvid att vi har en rad kod som faktiskt kallar GetString,
och lagrar det returnerade värdet i en variabel, kallad linje, av typen sträng.
Vi gör sedan en bit av en sanity check.
Om linje == null, då vi nyfiket återgå INT_MAX.
>> Nu visar det sig att INT_MAX är en speciell konstant deklareras annorstädes
som anger den största möjliga int att du kan representera i en
program som detta.
Nu har vi godtyckligt valt att återvända INT_MAX som en vaktpost värde
typer, en som vi har reserverat som vilket innebär ett fel har uppstått.
Så det pris vi betalar, är naturligtvis att getInt kan uppenbarligen inte
faktiskt tillbaka ett antal så stort som INT_MAX, för även om den vill,
som returvärde borde verkligen tolkas av den som ringer -
den som är med hjälp getInt -
som ett fel av något slag.
>> Därefter märker att jag har förklarat en int n och en röding c..
I detta nästa kodrad, kallar jag en Funktionen kallas sscanf, passerar
fyra argument.
linje, som är den sträng användarens skrivas in, "% i% c", som är ett format
sträng som jag väntar användaren kan typ, följt av adressen till
n, och adressen till c..
Nu sscanf s syfte i livet är verkligen att skanna en sträng söker den
särskilt format att programmeraren har angetts som det andra argumentet.
I detta fall är% i är i där, som är% c.
Så om sscanf möter en int i användarens input, kommer att int lagras
insidan av variabel kallad n, eftersom vi har gett som den tredje
Argumentet att sscanf adressen n.
Vilket betyder att sscanf faktiskt kan gå det, och uppdatera värdet däri.
>> Nu, i fall användaren skriver i något mer
än en eller flera siffror -
med andra ord, en röding av något slag -
den andra variabeln c, vars adress Vi gick in i sscanf som sin fjärde
argument kommer också att befolkas.
Nu uppsidan på sökning efter en ytterligare tecken från användaren är
att om han eller hon inte samarbetar, och typer i mer än bara en int,
Vi kommer att kunna upptäcka det i detta sätt, eftersom det i det fallet sscanf
kommer att återvända 2, vilket innebär att båda platshållare fylldes
med värden.
Men vi hoppas att sscanf istället returnerar 1, vilket betyder att användaren endast
förutsatt en int.
>> Vad gör vi om sscanf verkligen returnerar 1?
Tja, vi omedelbart befria den linje som användaren har skrivit in, och då vi
omedelbart åter n, som har fått en int.
Annars, om sscanf inte returnerar 1, och användaren därför inte samarbetade,
vi fortfarande frigöra linjen, men vi nu uppmana användaren att försöka igen.
Och eftersom vi är fortfarande inne i det annars oändlig slinga, processen
kommer att börja igen, och kanske igen, och kanske igen, tills användaren faktiskt
ger oss en int.