>> INTERLOCUTEUR 1: Prenons un coup d'oeil à la bibliothèque de CS50,
spécifiquement sa fonction de GetInt.
Ici, nous avons la source réelle code pour GetInt.
Et remarquez que ce n'est pas trop long, et la plus grande partie constitue une boucle while -
une boucle infinie à ce - que seule retourne une valeur une fois que nous avons fait
obtenu ce que nous attendions.
Marchons à travers elle.
>> Remarquez ici la première, la tout en boucle commence.
Notez ensuite que nous avons une ligne de code qui appelle effectivement GetString,
et stocke la valeur de retour dans un variable appelée ligne, de type chaîne.
Nous faisons alors un peu d'un test de cohérence.
Si la ligne == null, alors nous curieusement retourner INT_MAX.
>> Or, il s'avère que INT_MAX est un constante spéciale déclaré ailleurs
spécifie que la plus grande possible int que vous pouvez représenter dans un
programme de ce genre.
Maintenant, nous avons arbitrairement décidé d'y retourner INT_MAX comme une valeur de sentinelle de
sortes, celui que nous avons réservé comme ce qui signifie qu'une erreur s'est produite.
Ainsi, le prix que nous payons, bien sûr, est que GetInt peut apparemment pas
fait revenir un certain nombre aussi grand que INT_MAX, parce que même si elle veut,
que la valeur de retour doit vraiment être interprété par l'appelant -
celui qui se sert de GetInt -
comme une erreur de quelque sorte.
>> Ensuite, remarque que j'ai déclaré un int n et un char c.
Dans cette ligne de code suivante, que j'appelle un fonction appelée sscanf, en passant
quatre arguments.
La ligne, qui correspond à la chaîne de l'utilisateur tapé, "% i% c", qui est un format
chaîne que j'attends l'utilisateur peut le type, suivie de l'adresse de
n, et l'adresse de c.
Le but de maintenant sscanf dans la vie est en effet pour analyser une chaîne à la recherche de la
format particulier que le programmeur a précisé que ce deuxième argument.
Dans ce cas, i est en% là, comme c'est% c.
Donc, si sscanf rencontre un int dans le l'entrée de l'utilisateur, qui int sera enregistrée
l'intérieur de la variable appelée n, car nous avons fourni en tant que troisième
argument de sscanf l'adresse de n.
Ce qui signifie que sscanf peut en effet aller il, et mettre à jour la valeur y.
>> Or, dans le cas où les types d'utilisateurs dans quelque chose de plus
d'un ou plusieurs chiffres -
en d'autres termes, un caractère en quelque sorte -
cette seconde variable c, dont l'adresse nous passâmes dans sscanf que sa quatrième
l'argument sera également peuplée.
Maintenant, le côté positif de la vérification d'un caractère supplémentaire de l'utilisateur est
que si il ou elle ne coopère pas, et les types de plus que juste un int,
nous serons en mesure de le détecter dans ce manière, parce que dans ce cas, sscanf
va retourner 2, ce qui signifie que à la fois des espaces réservés ont été pourvus
avec des valeurs.
Mais nous espérons que sscanf place retourne 1, ce qui signifie que l'utilisateur ne
fourni un int.
>> Que faisons-nous si sscanf renvoie en effet 1?
Eh bien, nous libérons immédiatement la ligne qui l'utilisateur a tapé dans, puis nous
retourner immédiatement n, ayant obtenu un int.
Sinon, si sscanf ne revient pas 1, et l'utilisateur n'a donc pas coopéré,
nous libérons toujours la ligne, mais nous maintenant inviter l'utilisateur à réessayer.
Et parce que nous sommes toujours à l'intérieur de ce boucle infinie contraire, le processus
recommencera, et peut-être encore, et peut-être à nouveau, jusqu'à ce que l'utilisateur fait
nous fournit un int.