2 00:00:00,000 --> 00:00:01,860 >> ЗВУЧНИК 1: Ајде да ги разгледаме во CS50 библиотека, 3 00:00:01,860 --> 00:00:05,190 односно од неговата GetInt функција. 4 00:00:05,190 --> 00:00:07,820 Тука имаме вистински извор кодот за GetInt. 5 00:00:07,820 --> 00:00:12,050 И ќе забележите дека тоа не е премногу долго, и поголемиот дел од него претставува додека јамка - 6 00:00:12,050 --> 00:00:15,620 бесконечна јамка во тоа - дека само враќа вредност еднаш ние сме всушност 7 00:00:15,620 --> 00:00:17,400 добивано она што го очекуваше. 8 00:00:17,400 --> 00:00:18,700 Ајде да одиме низ него. 9 00:00:18,700 --> 00:00:21,650 >> Забележете тука прво, додека јамка почнува. 10 00:00:21,650 --> 00:00:25,390 Забележите следната дека имаме линија код кои, всушност, ги повикува GetString, 11 00:00:25,390 --> 00:00:29,620 и продавници вратената вредност во променлива, наречен линија, од типот стринг. 12 00:00:29,620 --> 00:00:31,210 Ние тогаш се направи малку здрав разум чек. 13 00:00:31,210 --> 00:00:35,770 Ако линија == NULL, тогаш ние љубопитно врати INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Сега излегува дека INT_MAX е специјални постојана прогласи друго место 15 00:00:40,140 --> 00:00:44,030 што го одредува најголем можен int што ќе може да претставуваат во 16 00:00:44,030 --> 00:00:45,160 програма како оваа. 17 00:00:45,160 --> 00:00:49,430 Сега сме произволно одлучи да се врати INT_MAX како стража вредноста на 18 00:00:49,430 --> 00:00:53,120 видови, еден дека ние сме се задржани како значи се случила грешка. 19 00:00:53,120 --> 00:00:56,230 Па цената што плаќаат, се разбира, е дека GetInt може очигледно не 20 00:00:56,230 --> 00:01:01,440 всушност се врати одреден број како голем како INT_MAX, бидејќи дури и ако сака да, 21 00:01:01,440 --> 00:01:04,730 дека враќањето вредност треба навистина да се толкува од страна на повикувачот - 22 00:01:04,730 --> 00:01:06,260 кој е со користење на GetInt - 23 00:01:06,260 --> 00:01:09,340 како грешка на некој вид. 24 00:01:09,340 --> 00:01:13,840 >> Следно, се забележи дека сум прогласена за на int n и знак c. 25 00:01:13,840 --> 00:01:18,030 Во овој следната линија на кодот, јас го нарекувам функција наречена sscanf, минувајќи во 26 00:01:18,030 --> 00:01:18,970 четири аргументи. 27 00:01:18,970 --> 00:01:25,110 линија, која е стринг на корисникот внеле во "% i% c", која е формат 28 00:01:25,110 --> 00:01:28,850 стринг кој јас сум очекуваме на корисникот може да тип, проследено со адреса на 29 00:01:28,850 --> 00:01:30,920 n и адреса на в. 30 00:01:30,920 --> 00:01:34,860 Сега sscanf е цел во животот е навистина за да го скенира низа во потрага за 31 00:01:34,860 --> 00:01:38,700 особено формат, кој на програмерот го специфицира како што вториот аргумент. 32 00:01:38,700 --> 00:01:42,020 Во овој случај,% i е во има, како што е% c. 33 00:01:42,020 --> 00:01:46,700 Па ако sscanf средби int во влез корисникот, кој int ќе се чуваат 34 00:01:46,700 --> 00:01:50,270 внатрешноста на променлива наречена n, бидејќи имаме обезбедени како трет 35 00:01:50,270 --> 00:01:52,810 аргумент за sscanf адресата на n. 36 00:01:52,810 --> 00:01:56,870 Што значи дека sscanf навистина може да оди таму, и надградба на вредноста во него. 37 00:01:56,870 --> 00:01:59,990 >> Сега, во случај корисникот видови во нешто повеќе 38 00:01:59,990 --> 00:02:01,220 од еден или повеќе цифри - 39 00:02:01,220 --> 00:02:03,570 со други зборови, на знак на некој вид - 40 00:02:03,570 --> 00:02:07,940 дека втората променлива в, чија адреса го поминавме во sscanf како четврти 41 00:02:07,940 --> 00:02:10,560 аргумент, исто така, ќе бидат населени. 42 00:02:10,560 --> 00:02:14,220 Сега главата на проверка за дополнителни лик од корисникот 43 00:02:14,220 --> 00:02:17,360 дека ако тој или таа не соработува, и видови во повеќе од само еден int, 44 00:02:17,360 --> 00:02:20,530 ние ќе бидеме во можност да го открие во овој начин, бидејќи во тој случај, sscanf 45 00:02:20,530 --> 00:02:24,860 се случува да се врати 2, означувајќи дека двете променливи беа исполнети 46 00:02:24,860 --> 00:02:25,600 со вредности. 47 00:02:25,600 --> 00:02:30,360 Но, ние се надеваме дека sscanf наместо се враќа 1, што значи дека корисникот само 48 00:02:30,360 --> 00:02:31,630 предвидени Инт. 49 00:02:31,630 --> 00:02:34,480 >> Што ќе правиме ако sscanf навистина се враќа 1? 50 00:02:34,480 --> 00:02:39,150 Па, ние веднаш го ослободи линија која на корисникот внесе во, а потоа ние 51 00:02:39,150 --> 00:02:42,670 веднаш да се врати n, имаат добивано и Инт. 52 00:02:42,670 --> 00:02:47,180 Друго, ако sscanf не се врати 1, и корисникот затоа не соработуваат, 53 00:02:47,180 --> 00:02:51,470 ние се уште се ослободи линија, но ние сега извести корисникот за да се обидете повторно. 54 00:02:51,470 --> 00:02:55,390 И бидејќи ние сме се уште во внатрешноста на тој инаку бесконечна јамка, процесот 55 00:02:55,390 --> 00:03:00,190 ќе започне повторно, а можеби и повторно, и можеби повторно, се додека корисникот всушност 56 00:03:00,190 --> 00:03:01,500 ни дава Инт. 57 00:03:01,500 --> 00:03:21,490