>> ALTAVEU 1: Anem a fer una ullada a la biblioteca CS50,
específicament la seva funció GetInt.
Aquí tenim la font real codi per GetInt.
I noti que no és massa llarg, i major part constitueix un bucle while -
un bucle infinit en el qual - que només retorna un valor, un cop hem fet
aconseguit el que esperàvem.
Anem a caminar a través d'ell.
>> Noteu aquí en primer lloc, la mentre que comença bucle.
Observi pròxim que tenim una línia de codi que en realitat diu GetString,
i emmagatzema el valor de retorn en un variables, la línia anomenada, de tipus string.
A continuació, fer una mica d'una prova de seny.
Si == línia nul · la, llavors curiosament tornar INT_MAX.
>> Ara resulta que és un INT_MAX constant especial declarat en un altre lloc
que especifica el major possible int que pot representar en un
programa com aquest.
Ara hem decidit arbitràriament per tornar INT_MAX com a valor sentinella de
classes, una que ens hem reservat com el que significa un error ha ocorregut.
Així que el preu que paguem, per descomptat, és que GetInt aparentment no pot
en realitat retornar un nombre tan gran com INT_MAX, perquè fins i tot si es vol,
que el valor de retorn ha de realment ser interpretada per la persona que truca -
qui està utilitzant GetInt -
com un error d'algun tipus.
>> A continuació, m'adono que he declarat 01:00 int n i un char c.
En aquesta següent línia de codi, que jo anomeno un funció anomenada sscanf, passant
quatre arguments.
línia, que és la cadena de l'usuari escrit en, "% i% c", que és un format
cadena que estic esperant el poder d'usuari tipus, seguit de l'adreça de
n, i la direcció de c.
Ara propòsit de sscanf a la vida és de fet per analitzar una cadena a la recerca de la
format particular que el programador ha especificat com el segon argument.
En aquest cas, i és en% allà, com és% c.
Així que si es troba amb sscanf 1 int al d'entrada de l'usuari, s'emmagatzemarà que int
interior de la variable anomenada n, perquè hem proporcionat com la tercera
argument per sscanf la direcció de n.
Això significa que de fet pot anar sscanf allà, i actualitzar el valor de la mateixa.
>> Ara, en cas que l'usuari en alguna cosa més
d'un o més dígits -
En altres paraules, un char d'algun tipus -
aquesta segona variable c, la direcció passem a sscanf com el seu quart
argument també s'omplirà.
Ara, el costat positiu de la comprovació d'una caràcter addicional de l'usuari és
que si ell o ella no coopera, i els tipus en alguna cosa més que un int,
serem capaços de detectar en aquest manera, perquè en aquest cas, sscanf
tornarà 2, el que significa que tant dels marcadors de posició es van omplir
amb valors.
Però estem esperant que sscanf lloc retorna 1, el que significa que només l'usuari
proporcionat un int.
>> Què fem si sscanf de fet retorna 1?
Bé, ens alliberem immediatament la línia que l'usuari va escriure, i després
tornar immediatament n, tenint aconseguit un int.
Perquè si sscanf no retorna 1, i l'usuari, per tant, no cooperar,
encara ens alliberem de la línia, però ara demanarà a l'usuari que torni a intentar-ho.
I pel fet que encara estem dins d'aquest en cas contrari bucle infinit, el procés
començarà de nou, i potser de nou, i potser de nou, fins que l'usuari realment
ens proporciona un int.