2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Să aruncăm o privire la bibliotecă CS50, 3 00:00:01,860 --> 00:00:05,190 în special funcția sa getint. 4 00:00:05,190 --> 00:00:07,820 Aici avem sursa reală cod pentru getint. 5 00:00:07,820 --> 00:00:12,050 Și observați că nu e prea mult timp, și cea mai mare parte constituie o buclă în timp ce - 6 00:00:12,050 --> 00:00:15,620 o buclă infinită în care - pe care numai returnează o valoare odată ce ne-am de fapt, 7 00:00:15,620 --> 00:00:17,400 primit ceea ce ne-am așteptat. 8 00:00:17,400 --> 00:00:18,700 Să mergem prin ea. 9 00:00:18,700 --> 00:00:21,650 >> Observați aici în primul rând, în timp ce bucla incepe. 10 00:00:21,650 --> 00:00:25,390 Observați următorul că avem o linie de cod care cheamă de fapt getString, 11 00:00:25,390 --> 00:00:29,620 și stochează valoarea de returnare într-o variabilă, numită linie, de tip șir. 12 00:00:29,620 --> 00:00:31,210 Atunci vom face un pic de un cec bun-simț. 13 00:00:31,210 --> 00:00:35,770 Dacă linie == null, atunci ne-am curios reveni INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Acum se dovedește că INT_MAX este o constantă special a declarat în altă parte 15 00:00:40,140 --> 00:00:44,030 care specifică cea mai mare posibil int pe care le poate reprezenta într-un 16 00:00:44,030 --> 00:00:45,160 program de genul asta. 17 00:00:45,160 --> 00:00:49,430 Acum, ne-am decis în mod arbitrar să se întoarcă INT_MAX ca o valoare de santinelă 18 00:00:49,430 --> 00:00:53,120 tipuri, unul care le-am rezervat ca ceea ce înseamnă o eroare a avut loc. 19 00:00:53,120 --> 00:00:56,230 Astfel încât prețul pe care îl plătiți, desigur, este că getint aparent nu se poate 20 00:00:56,230 --> 00:01:01,440 reveni de fapt un număr cât mai mare INT_MAX, pentru că chiar dacă dorește să, 21 00:01:01,440 --> 00:01:04,730 că valoarea de returnare ar trebui într-adevăr fi interpretat de către apelant - 22 00:01:04,730 --> 00:01:06,260 oricine folosește getint - 23 00:01:06,260 --> 00:01:09,340 ca o eroare de un anumit fel. 24 00:01:09,340 --> 00:01:13,840 >> Apoi, observați că am declarat o int n și un char c. 25 00:01:13,840 --> 00:01:18,030 În acest următoarea linie de cod, eu numesc o Funcția numit sscanf, trece în 26 00:01:18,030 --> 00:01:18,970 patru argumente. 27 00:01:18,970 --> 00:01:25,110 linie, care este șirul utilizatorului tastat în "% i% c", care este un format 28 00:01:25,110 --> 00:01:28,850 șir că mă aștept puterea de utilizator tip, urmată de adresa 29 00:01:28,850 --> 00:01:30,920 n, și adresa de c.. 30 00:01:30,920 --> 00:01:34,860 Scopul acum sscanf lui în viață este într-adevăr pentru a scana un șir în căutarea 31 00:01:34,860 --> 00:01:38,700 format special că programatorul a precizat ca al doilea argument. 32 00:01:38,700 --> 00:01:42,020 În acest caz,% i este în acolo, așa cum este% c. 33 00:01:42,020 --> 00:01:46,700 Deci, dacă se confruntă cu un int sscanf în intrare de utilizator, care int vor fi stocate 34 00:01:46,700 --> 00:01:50,270 interiorul variabilei numit n, deoarece am furnizat ca al treilea 35 00:01:50,270 --> 00:01:52,810 argument pentru sscanf adresa nr. 36 00:01:52,810 --> 00:01:56,870 Ceea ce înseamnă că sscanf poate merge într-adevăr acolo, și actualizarea valorii în acesta. 37 00:01:56,870 --> 00:01:59,990 >> Acum, în cazul în care utilizatorul tastează în ceva mai mult 38 00:01:59,990 --> 00:02:01,220 mult de una sau mai multe cifre - 39 00:02:01,220 --> 00:02:03,570 cu alte cuvinte, un caracter de un anumit fel - 40 00:02:03,570 --> 00:02:07,940 că a doua c variabil, a cărui adresă am trecut în sscanf ca al patrulea său 41 00:02:07,940 --> 00:02:10,560 argument va fi, de asemenea, populate. 42 00:02:10,560 --> 00:02:14,220 Acum, capul de verificare pentru o caracter suplimentar de utilizator este 43 00:02:14,220 --> 00:02:17,360 că, dacă el sau ea nu cooperează, și tipuri în mai mult decât un int, 44 00:02:17,360 --> 00:02:20,530 vom fi capabili de a detecta în acest mod, pentru că în acest caz, sscanf 45 00:02:20,530 --> 00:02:24,860 este de gând să se întoarcă 2, ceea ce înseamnă că ambele substituenții s-au umplut 46 00:02:24,860 --> 00:02:25,600 cu valori. 47 00:02:25,600 --> 00:02:30,360 Dar suntem în speranța că sscanf loc returnează 1, ceea ce înseamnă doar utilizatorul 48 00:02:30,360 --> 00:02:31,630 prevăzut un int. 49 00:02:31,630 --> 00:02:34,480 >> Ce facem dacă sscanf într-adevăr se întoarce 1? 50 00:02:34,480 --> 00:02:39,150 Ei bine, ne-am elibera imediat linia care utilizatorul tastat în, și apoi ne-am 51 00:02:39,150 --> 00:02:42,670 reveni imediat n, având ajuns un int. 52 00:02:42,670 --> 00:02:47,180 Altfel, dacă sscanf nu se întoarce 1, și Prin urmare, utilizatorul nu a cooperat, 53 00:02:47,180 --> 00:02:51,470 am încă elibera linia, dar ne-am acum cere utilizatorului să încercați din nou. 54 00:02:51,470 --> 00:02:55,390 Și pentru că suntem încă în interiorul de care buclă infinită în caz contrar, procesul 55 00:02:55,390 --> 00:03:00,190 va începe din nou, și, poate, din nou, și poate din nou, până când utilizatorul efectiv 56 00:03:00,190 --> 00:03:01,500 ne oferă un int. 57 00:03:01,500 --> 00:03:21,490