>> SPEAKER 1: Lad os tage et kig på CS50 bibliotek,
specielt dens GetInt funktion.
Her har vi den egentlige kilde kode for GetInt.
Og bemærk, at det ikke er for lang, og det meste af det udgør en while-løkke -
en uendelig løkke, der - som kun returnerer en værdi, når vi har faktisk
fået hvad vi forventede.
Lad os gå igennem det.
>> Bemærk op her først, mens løkken begynder.
Bemærk næste, at vi har en linje kode der faktisk opfordrer getString,
og gemmer returværdien i en variabel, kaldet linje af typen string.
Vi så gøre lidt af et sanity check.
Hvis linje == null, så vi nysgerrigt tilbage INT_MAX.
>> Nu viser det sig, at INT_MAX er en særlig konstant erklæret andetsteds
, der angiver den størst mulige int, at du kan repræsentere i en
program som dette.
Nu har vi vilkårligt besluttet at vende tilbage INT_MAX som en skildvagt værdi på
slags, som vi har reserveret som er opstået betyder en fejl.
Så den pris, vi betaler, er naturligvis at GetInt kan tilsyneladende ikke
faktisk returnere en tal så stor som INT_MAX, fordi selv hvis det ønsker at,
at returværdi burde virkelig fortolkes af den, der ringer -
hvem er ved hjælp af GetInt -
som en fejl af en slags.
>> Dernæst mærke til, at jeg har erklæret en int n og en char c.
I denne næste linje kode, jeg kalder en funktion kaldet sscanf, der passerer i
fire argumenter.
linje, der er den streng brugerens indtastet, "% i% c", som er et format
streng, som jeg forventer at brugeren måske typen, efterfulgt af adressen
n, og adressen på ca.
Nu sscanf formål i livet er faktisk at scanne en streng på udkig efter den
bestemt format at programmøren har angivet som det andet argument.
I dette tilfælde% i er i der, som er% ca.
Så hvis sscanf støder en int i brugerens input, vil denne int lagres
indersiden af ​​variablen n, fordi vi har givet som den tredje
argument for at sscanf adressen n.
Hvilket betyder, at sscanf faktisk kan gå der, og opdatere værdien deri.
>> Nu, i tilfælde af at brugeren typer i noget mere
end én eller flere cifre -
med andre ord, en char af en slags -
at anden variabel c, hvis adresse vi gik ind sscanf som sin fjerde
argument vil også blive befolket.
Nu opadrettede af kontrol for en yderligere tegn fra brugeren
at hvis han eller hun ikke samarbejder, og typer i mere end blot en int,
vi vil være i stand til at opdage det i dette måde, fordi der i så fald sscanf
kommer til at returnere 2, hvilket signalerer, at begge pladsholdere blev fyldt
med værdier.
Men vi håber, at sscanf stedet returnerer 1, hvilket betyder, at brugeren kun
forudsat en int.
>> Hvad gør vi, hvis sscanf faktisk returnerer 1.?
Nå, vi straks befri den linje, brugeren har skrevet i, og så vi
øjeblikkeligt returnere n, der fået en int.
Else, hvis sscanf ikke vender tilbage 1, og brugeren derfor ikke samarbejder,
vi stadig slippe linjen, men vi nu bede brugeren om at prøve igen.
Og fordi vi er stadig inde i det ellers uendelig løkke, processen
vil begynde igen og måske igen, og måske igen, indtil brugeren faktisk
giver os en int.