>> SPEAKER 1: La oss ta en titt på CS50 bibliotek,
spesielt dens GetInt funksjon.
Her har vi selve kilden kode for GetInt.
Og legg merke til at det ikke er for lang, og det meste av det som utgjør en while-loop -
en uendelig løkke på det - at bare returnerer en verdi når vi har faktisk
fått hva vi forventet.
La oss gå gjennom den.
>> Legg merke seg her først, mens loop begynner.
Legg merke til neste at vi har en linje med kode som faktisk kaller GetString,
og lagrer returverdien i en variable, kalt linje, av typen streng.
Vi gjør deretter en bit av en mental helse sjekk.
Hvis linjen == null, så vi merkelig returnere INT_MAX.
>> Nå viser det seg at INT_MAX er en spesiell konstant erklært andre steder
som angir størst mulig int at du kan representere i en
program som dette.
Nå har vi vilkårlig besluttet å gå tilbake INT_MAX som en sentinel verdien av
slag, en som vi har reservert som noe som betyr en feil har oppstått.
Så prisen vi betaler, selvfølgelig, er at GetInt kan tydeligvis ikke
faktisk returnere et tall så stort som INT_MAX, fordi selv om den ønsker å,
at returverdien burde virkelig tolkes av den som ringer -
hvem som brukar GetInt -
som en feil av noe slag.
>> Neste, merker at jeg har erklært en int n og en char c.
I denne neste linje med kode, kaller jeg en funksjon kalt sscanf, passerer i
fire argumenter.
linje, som er strengen brukerens skrevet i, "% i% c", som er et format
streng som jeg forventer at brukeren makt type, etterfulgt av adressen
n, og adressen til ca.
Nå sscanf formål i livet er virkelig å skanne en streng på jakt etter den
bestemt format som programmerer har spesifisert som det andre argumentet.
I dette tilfelle er% i i der, er% c som.
Så hvis sscanf møter en int i brukerens innmating, vil den int lagres
innsiden av variabel kalt n, fordi vi har gitt som den tredje
argument for å sscanf adressen til n.
Hvilket betyr at sscanf kan faktisk gå der, og oppdatere verdien i dette.
>> Nå, i tilfelle brukeren skriver i noe mer
enn ett eller flere sifre -
med andre ord, en røye av noe slag -
at andre variable c, som har en adresse vi gått inn sscanf som sin fjerde
argumentet vil også bli befolket.
Nå oppsiden av å sjekke for en ekstra karakter fra brukeren er
at hvis han eller hun ikke samarbeider, og typer i mer enn bare en int,
vi vil være i stand til å oppdage det i dette måte, fordi i så fall, sscanf
kommer til å vende tilbake 2, som viser at både av plassholderne ble fylt
med verdier.
Men vi håper at sscanf stedet returnerer 1, som betyr at brukeren bare
gitt en int.
>> Hva gjør vi hvis sscanf faktisk returnerer en?
Vel, vi umiddelbart frigjøre linjen som brukeren har skrevet inn, og da vi
umiddelbart returnere n, ha fått en int.
Else, hvis sscanf ikke returnerer en, og brukeren derfor ikke samarbeidet,
vi fortsatt frigjøre linjen, men vi nå be brukeren om å prøve på nytt.
Og fordi vi er fortsatt inne i det ellers uendelig loop, prosessen
begynner på nytt, og kanskje igjen, og kanskje igjen, inntil brukeren faktisk
gir oss en int.