2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 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 Ако линията == нула, тогава ние любопитно върнете 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 >> На следващо място, забелязваме, че съм обявен едно цяло число 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 линия, която е низ на потребителя въведена в "% и% в", който е формат 28 00:01:25,110 --> 00:01:28,850 низ, че аз съм в очакване на потребителското мощта тип, последвано от адреса на 29 00:01:28,850 --> 00:01:30,920 п и адреса на в. 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 В този случай,% и е в там, както е в%. 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 адреса на п. 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 че втората променлива C, чийто адрес минахме в 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 че ако той или тя не оказва съдействие, и видове в повече от просто едно цяло число, 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 незабавно да върне н, като намерила на вътр. 52 00:02:42,670 --> 00:02:47,180 Иначе, ако sscanf не се връща един и следователно потребителят не е оказал съдействие, 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