2 00:00:00,000 --> 00:00:01,860 >> INTERLOCUTEUR 1: Prenons un coup d'oeil à la bibliothèque de CS50, 3 00:00:01,860 --> 00:00:05,190 spécifiquement sa fonction de GetInt. 4 00:00:05,190 --> 00:00:07,820 Ici, nous avons la source réelle code pour GetInt. 5 00:00:07,820 --> 00:00:12,050 Et remarquez que ce n'est pas trop long, et la plus grande partie constitue une boucle while - 6 00:00:12,050 --> 00:00:15,620 une boucle infinie à ce - que seule retourne une valeur une fois que nous avons fait 7 00:00:15,620 --> 00:00:17,400 obtenu ce que nous attendions. 8 00:00:17,400 --> 00:00:18,700 Marchons à travers elle. 9 00:00:18,700 --> 00:00:21,650 >> Remarquez ici la première, la tout en boucle commence. 10 00:00:21,650 --> 00:00:25,390 Notez ensuite que nous avons une ligne de code qui appelle effectivement GetString, 11 00:00:25,390 --> 00:00:29,620 et stocke la valeur de retour dans un variable appelée ligne, de type chaîne. 12 00:00:29,620 --> 00:00:31,210 Nous faisons alors un peu d'un test de cohérence. 13 00:00:31,210 --> 00:00:35,770 Si la ligne == null, alors nous curieusement retourner INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Or, il s'avère que INT_MAX est un constante spéciale déclaré ailleurs 15 00:00:40,140 --> 00:00:44,030 spécifie que la plus grande possible int que vous pouvez représenter dans un 16 00:00:44,030 --> 00:00:45,160 programme de ce genre. 17 00:00:45,160 --> 00:00:49,430 Maintenant, nous avons arbitrairement décidé d'y retourner INT_MAX comme une valeur de sentinelle de 18 00:00:49,430 --> 00:00:53,120 sortes, celui que nous avons réservé comme ce qui signifie qu'une erreur s'est produite. 19 00:00:53,120 --> 00:00:56,230 Ainsi, le prix que nous payons, bien sûr, est que GetInt peut apparemment pas 20 00:00:56,230 --> 00:01:01,440 fait revenir un certain nombre aussi grand que INT_MAX, parce que même si elle veut, 21 00:01:01,440 --> 00:01:04,730 que la valeur de retour doit vraiment être interprété par l'appelant - 22 00:01:04,730 --> 00:01:06,260 celui qui se sert de GetInt - 23 00:01:06,260 --> 00:01:09,340 comme une erreur de quelque sorte. 24 00:01:09,340 --> 00:01:13,840 >> Ensuite, remarque que j'ai déclaré un int n et un char c. 25 00:01:13,840 --> 00:01:18,030 Dans cette ligne de code suivante, que j'appelle un fonction appelée sscanf, en passant 26 00:01:18,030 --> 00:01:18,970 quatre arguments. 27 00:01:18,970 --> 00:01:25,110 La ligne, qui correspond à la chaîne de l'utilisateur tapé, "% i% c", qui est un format 28 00:01:25,110 --> 00:01:28,850 chaîne que j'attends l'utilisateur peut le type, suivie de l'adresse de 29 00:01:28,850 --> 00:01:30,920 n, et l'adresse de c. 30 00:01:30,920 --> 00:01:34,860 Le but de maintenant sscanf dans la vie est en effet pour analyser une chaîne à la recherche de la 31 00:01:34,860 --> 00:01:38,700 format particulier que le programmeur a précisé que ce deuxième argument. 32 00:01:38,700 --> 00:01:42,020 Dans ce cas, i est en% là, comme c'est% c. 33 00:01:42,020 --> 00:01:46,700 Donc, si sscanf rencontre un int dans le l'entrée de l'utilisateur, qui int sera enregistrée 34 00:01:46,700 --> 00:01:50,270 l'intérieur de la variable appelée n, car nous avons fourni en tant que troisième 35 00:01:50,270 --> 00:01:52,810 argument de sscanf l'adresse de n. 36 00:01:52,810 --> 00:01:56,870 Ce qui signifie que sscanf peut en effet aller il, et mettre à jour la valeur y. 37 00:01:56,870 --> 00:01:59,990 >> Or, dans le cas où les types d'utilisateurs dans quelque chose de plus 38 00:01:59,990 --> 00:02:01,220 d'un ou plusieurs chiffres - 39 00:02:01,220 --> 00:02:03,570 en d'autres termes, un caractère en quelque sorte - 40 00:02:03,570 --> 00:02:07,940 cette seconde variable c, dont l'adresse nous passâmes dans sscanf que sa quatrième 41 00:02:07,940 --> 00:02:10,560 l'argument sera également peuplée. 42 00:02:10,560 --> 00:02:14,220 Maintenant, le côté positif de la vérification d'un caractère supplémentaire de l'utilisateur est 43 00:02:14,220 --> 00:02:17,360 que si il ou elle ne coopère pas, et les types de plus que juste un int, 44 00:02:17,360 --> 00:02:20,530 nous serons en mesure de le détecter dans ce manière, parce que dans ce cas, sscanf 45 00:02:20,530 --> 00:02:24,860 va retourner 2, ce qui signifie que à la fois des espaces réservés ont été pourvus 46 00:02:24,860 --> 00:02:25,600 avec des valeurs. 47 00:02:25,600 --> 00:02:30,360 Mais nous espérons que sscanf place retourne 1, ce qui signifie que l'utilisateur ne 48 00:02:30,360 --> 00:02:31,630 fourni un int. 49 00:02:31,630 --> 00:02:34,480 >> Que faisons-nous si sscanf renvoie en effet 1? 50 00:02:34,480 --> 00:02:39,150 Eh bien, nous libérons immédiatement la ligne qui l'utilisateur a tapé dans, puis nous 51 00:02:39,150 --> 00:02:42,670 retourner immédiatement n, ayant obtenu un int. 52 00:02:42,670 --> 00:02:47,180 Sinon, si sscanf ne revient pas 1, et l'utilisateur n'a donc pas coopéré, 53 00:02:47,180 --> 00:02:51,470 nous libérons toujours la ligne, mais nous maintenant inviter l'utilisateur à réessayer. 54 00:02:51,470 --> 00:02:55,390 Et parce que nous sommes toujours à l'intérieur de ce boucle infinie contraire, le processus 55 00:02:55,390 --> 00:03:00,190 recommencera, et peut-être encore, et peut-être à nouveau, jusqu'à ce que l'utilisateur fait 56 00:03:00,190 --> 00:03:01,500 nous fournit un int. 57 00:03:01,500 --> 00:03:21,490