>> SPEAKER 1: Să aruncăm o privire la bibliotecă CS50,
în special funcția sa getint.
Aici avem sursa reală cod pentru getint.
Și observați că nu e prea mult timp, și cea mai mare parte constituie o buclă în timp ce -
o buclă infinită în care - pe care numai returnează o valoare odată ce ne-am de fapt,
primit ceea ce ne-am așteptat.
Să mergem prin ea.
>> Observați aici în primul rând, în timp ce bucla incepe.
Observați următorul că avem o linie de cod care cheamă de fapt getString,
și stochează valoarea de returnare într-o variabilă, numită linie, de tip șir.
Atunci vom face un pic de un cec bun-simț.
Dacă linie == null, atunci ne-am curios reveni INT_MAX.
>> Acum se dovedește că INT_MAX este o constantă special a declarat în altă parte
care specifică cea mai mare posibil int pe care le poate reprezenta într-un
program de genul asta.
Acum, ne-am decis în mod arbitrar să se întoarcă INT_MAX ca o valoare de santinelă
tipuri, unul care le-am rezervat ca ceea ce înseamnă o eroare a avut loc.
Astfel încât prețul pe care îl plătiți, desigur, este că getint aparent nu se poate
reveni de fapt un număr cât mai mare INT_MAX, pentru că chiar dacă dorește să,
că valoarea de returnare ar trebui într-adevăr fi interpretat de către apelant -
oricine folosește getint -
ca o eroare de un anumit fel.
>> Apoi, observați că am declarat o int n și un char c.
În acest următoarea linie de cod, eu numesc o Funcția numit sscanf, trece în
patru argumente.
linie, care este șirul utilizatorului tastat în "% i% c", care este un format
șir că mă aștept puterea de utilizator tip, urmată de adresa
n, și adresa de c..
Scopul acum sscanf lui în viață este într-adevăr pentru a scana un șir în căutarea
format special că programatorul a precizat ca al doilea argument.
În acest caz,% i este în acolo, așa cum este% c.
Deci, dacă se confruntă cu un int sscanf în intrare de utilizator, care int vor fi stocate
interiorul variabilei numit n, deoarece am furnizat ca al treilea
argument pentru sscanf adresa nr.
Ceea ce înseamnă că sscanf poate merge într-adevăr acolo, și actualizarea valorii în acesta.
>> Acum, în cazul în care utilizatorul tastează în ceva mai mult
mult de una sau mai multe cifre -
cu alte cuvinte, un caracter de un anumit fel -
că a doua c variabil, a cărui adresă am trecut în sscanf ca al patrulea său
argument va fi, de asemenea, populate.
Acum, capul de verificare pentru o caracter suplimentar de utilizator este
că, dacă el sau ea nu cooperează, și tipuri în mai mult decât un int,
vom fi capabili de a detecta în acest mod, pentru că în acest caz, sscanf
este de gând să se întoarcă 2, ceea ce înseamnă că ambele substituenții s-au umplut
cu valori.
Dar suntem în speranța că sscanf loc returnează 1, ceea ce înseamnă doar utilizatorul
prevăzut un int.
>> Ce facem dacă sscanf într-adevăr se întoarce 1?
Ei bine, ne-am elibera imediat linia care utilizatorul tastat în, și apoi ne-am
reveni imediat n, având ajuns un int.
Altfel, dacă sscanf nu se întoarce 1, și Prin urmare, utilizatorul nu a cooperat,
am încă elibera linia, dar ne-am acum cere utilizatorului să încercați din nou.
Și pentru că suntem încă în interiorul de care buclă infinită în caz contrar, procesul
va începe din nou, și, poate, din nou, și poate din nou, până când utilizatorul efectiv
ne oferă un int.