1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [Muziek] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: Oke. 4 00:00:12,100 --> 00:00:15,620 Dus, het eerste wat eerst, video van een bekend gezicht. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [VIDEO AFSPELEN] 7 00:00:22,560 --> 00:00:23,370 >> -Oke. 8 00:00:23,370 --> 00:00:27,150 Dit is CS50, en dit is het begin van de week drie. 9 00:00:27,150 --> 00:00:29,980 Het spijt me dat ik kon er niet bij je vandaag, maar laat mij in te voeren 10 00:00:29,980 --> 00:00:32,880 CS50 eigen Rob Boden. 11 00:00:32,880 --> 00:00:33,872 >> [END VIDEO AFSPELEN] 12 00:00:33,872 --> 00:00:39,340 >> [Applaus en gejuich] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: De filmografie in die video is fantastisch. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Oke. 16 00:00:47,770 --> 00:00:50,960 Dus eerst, er is nog een lunch. 17 00:00:50,960 --> 00:00:52,330 Het is morgen om 01:15. 18 00:00:52,330 --> 00:00:54,480 Er is geen lunch deze vrijdag. 19 00:00:54,480 --> 00:00:55,810 Het is met Quora. 20 00:00:55,810 --> 00:01:00,190 En Tommy is er nog niet, maar een van de mensen daar is voormalig hoofd CF, 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Dus hij is een leuke vent. 23 00:01:02,730 --> 00:01:04,819 Je moet komen. 24 00:01:04,819 --> 00:01:05,900 >> Oke. 25 00:01:05,900 --> 00:01:11,360 Dus vorige week zijn we begonnen met het breken van elkaar over wat een string werkelijk is. 26 00:01:11,360 --> 00:01:14,830 We weten al sinds het begin dat het is een reeks tekens. 27 00:01:14,830 --> 00:01:18,130 Maar vorige week, we dook in het feit dat wat is eigenlijk een opeenvolging van 28 00:01:18,130 --> 00:01:22,110 personages, goed, hebben we nu arrays van karakters. 29 00:01:22,110 --> 00:01:26,450 En we weten dat een string, het is een array karakters, aan het einde, 30 00:01:26,450 --> 00:01:30,920 we hebben deze speciale null byte, dit backslash 0, die aangeeft eind 31 00:01:30,920 --> 00:01:32,230 de string. 32 00:01:32,230 --> 00:01:36,970 >> En dus een string is een array van karakters, maar we kunnen meer dan 33 00:01:36,970 --> 00:01:39,530 onder reeks karakters, kunnen we een verzameling volgens hebben 34 00:01:39,530 --> 00:01:40,890 type wat we willen. 35 00:01:40,890 --> 00:01:51,570 Dus, als u zich herinneren van vorige week, de Leeftijden programma dat David geïntroduceerd 36 00:01:51,570 --> 00:01:53,560 heel snel. 37 00:01:53,560 --> 00:01:57,010 Dus eerste wat we gaan doen is vraagt ​​de gebruiker om een ​​geheel getal, de 38 00:01:57,010 --> 00:01:58,800 aantal mensen in de kamer. 39 00:01:58,800 --> 00:02:01,260 Zodra we dat integer, we verklaren een array. 40 00:02:01,260 --> 00:02:02,890 Let op deze syntaxis beugel. 41 00:02:02,890 --> 00:02:04,540 Je gaat wennen. 42 00:02:04,540 --> 00:02:09,430 >> Dus we verklaren een array van integers genoemd leeftijden en er n 43 00:02:09,430 --> 00:02:12,080 getallen in deze array. 44 00:02:12,080 --> 00:02:16,480 Dus dit patroon hier, dit 4 int i gelijk is aan 0, i kleiner dan n, i plus 45 00:02:16,480 --> 00:02:20,580 plus, dat gaat ook om een ​​patroon te zijn dat je erg wennen. 46 00:02:20,580 --> 00:02:24,000 Want dat is vrij veel hoe je bent altijd gaat om itereren over arrays. 47 00:02:24,000 --> 00:02:26,330 Dus onthoud dat n de lengte van onze array. 48 00:02:26,330 --> 00:02:32,120 En dus even, we voortdurend aan voor de leeftijd van de persoon die ik in de kamer. 49 00:02:32,120 --> 00:02:36,640 >> Hierna gaan we naar beneden, en om welke arbitraire reden, dan kunnen we 50 00:02:36,640 --> 00:02:40,220 uitprinten hoe oud ze gaan een jaar vanaf nu. 51 00:02:40,220 --> 00:02:49,980 En lopen dat programma, laten we maken leeftijden, dot slash leeftijden. 52 00:02:49,980 --> 00:02:53,010 Dus het aantal mensen in de kamer, laten we zeggen dat er drie. 53 00:02:53,010 --> 00:02:59,880 En zeg, de eerste persoon is 13, volgende is 26, en de laatste is 30. 54 00:02:59,880 --> 00:03:05,080 Dus dan is het wel over die drie herhalen mensen een afdruk van 14, 27, en 31. 55 00:03:05,080 --> 00:03:16,060 >> Dus vergeet niet dat wanneer we verklaren een matrix van grootte n, de indices in die 56 00:03:16,060 --> 00:03:19,950 array, de array waarden en indices 0, 1, 2, de hele weg 57 00:03:19,950 --> 00:03:21,680 tot n minus 1. 58 00:03:21,680 --> 00:03:26,255 Dus toen we zeiden dat er drie mensen in de kamer, en we zetten hier 59 00:03:26,255 --> 00:03:29,850 de eerste iteratie via deze lus, ik zal worden 0. 60 00:03:29,850 --> 00:03:31,650 Dus in index 0. 61 00:03:31,650 --> 00:03:34,540 We zijn het toewijzen van de eerste de leeftijd van de gebruiker invoert. 62 00:03:34,540 --> 00:03:38,870 Dan in de volgende, we zijn het invoeren van de tweede n de gebruiker invoert, en in 63 00:03:38,870 --> 00:03:40,580 naast twee, de laatste n. 64 00:03:40,580 --> 00:03:44,200 >> Zo merken dat een array van grootte drie niets hebben 65 00:03:44,200 --> 00:03:46,040 in de index drie. 66 00:03:46,040 --> 00:03:49,036 Dit is niet geldig. 67 00:03:49,036 --> 00:03:50,250 Oke. 68 00:03:50,250 --> 00:03:55,136 Dus, terug te gaan hier. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Dus nu dat we hebben behandeld met arrays, we hebben enige vertrouwdheid. 71 00:04:01,590 --> 00:04:03,780 Nu gaan we om verder te gaan naar command line argumenten, die zullen worden 72 00:04:03,780 --> 00:04:05,890 vrij relevant voor dit probleem set. 73 00:04:05,890 --> 00:04:09,670 >> Dus tot nu toe, wanneer je hebt uw belangrijkste functie verklaard, we hebben 74 00:04:09,670 --> 00:04:11,230 zei int main nietig. 75 00:04:11,230 --> 00:04:14,070 Dus leegte betekent gewoon dat we lopen niet elke 76 00:04:14,070 --> 00:04:16,440 argumenten voor deze functie. 77 00:04:16,440 --> 00:04:19,190 Nu gaan we om de hoofdklasse zien kunnen enkele argumenten nemen. 78 00:04:19,190 --> 00:04:22,470 Ze hier noemen we int argc en strijkorkest argv beugels. 79 00:04:22,470 --> 00:04:26,930 De beugels opnieuw aangeeft dat we te maken hebben met arrays. 80 00:04:26,930 --> 00:04:31,850 Dus hier, touwtje argv haakjes, we zijn te maken met een array van strings. 81 00:04:31,850 --> 00:04:35,360 Dus argc, dat gaat geven hoeveel argumenten we hebben 82 00:04:35,360 --> 00:04:37,580 doorgegeven aan het programma. 83 00:04:37,580 --> 00:04:46,050 En om te zien wat dat betekent, laten we sluiten dit. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Dus tot nu toe hebben we elke run programma zoals dot slash leeftijden. 86 00:04:50,790 --> 00:04:55,250 We kunnen ook op de opdrachtregel, verleden gaat worden, vandaar de term, commando 87 00:04:55,250 --> 00:04:56,550 line argumenten. 88 00:04:56,550 --> 00:04:59,760 Dus het eerste argument, hello wereld. 89 00:04:59,760 --> 00:05:03,350 Dus hier, zou argc drie. 90 00:05:03,350 --> 00:05:07,720 Het is de telling van de argumenten op de opdrachtregel. 91 00:05:07,720 --> 00:05:12,840 Argc is altijd minimaal 1, omdat dot slash leeftijden, zelf, geldt als een van 92 00:05:12,840 --> 00:05:14,490 de commandoregel argumenten. 93 00:05:14,490 --> 00:05:17,010 >> Dan is hello de eerste. 94 00:05:17,010 --> 00:05:20,460 Als dot slash leeftijden is de nulde, dan hallo is de eerste, en de wereld is de 95 00:05:20,460 --> 00:05:22,830 tweede command line argument. 96 00:05:22,830 --> 00:05:29,490 Dus de string argv, we zullen gaan zien, bevat de snaren, dot slash 97 00:05:29,490 --> 00:05:33,830 leeftijden, hello, en de wereld. 98 00:05:33,830 --> 00:05:38,945 En, op verzoek van David, we gaan om een ​​video te introduceren die spelen. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [VIDEO AFSPELEN] 101 00:05:43,890 --> 00:05:46,240 >> -Tot nu toe in de programma's die we hebben geschreven, hebben we verklaren 102 00:05:46,240 --> 00:05:48,500 hoofd als int main nietig. 103 00:05:48,500 --> 00:05:51,170 En al die tijd, die leegte heeft gewoon is bepaald dat de 104 00:05:51,170 --> 00:05:54,430 programma geen rekening command line argumenten. 105 00:05:54,430 --> 00:05:57,750 Met andere woorden, wanneer een gebruiker loopt een programma, kan hij of zij opdracht te verstrekken 106 00:05:57,750 --> 00:06:01,710 line argumenten door het schrijven van extra woorden of zinnen na het programma 107 00:06:01,710 --> 00:06:03,000 naam op de prompt. 108 00:06:03,000 --> 00:06:06,550 >> Nou, als je je je programma te willen neem command line argumenten, een of 109 00:06:06,550 --> 00:06:10,540 meer van dergelijke woorden, we moeten vervangen vervalt met een paar argumenten. 110 00:06:10,540 --> 00:06:12,200 Dus laten we dat doen. 111 00:06:12,200 --> 00:06:15,750 Omvatten CS50.h. 112 00:06:15,750 --> 00:06:19,360 Zijn standaard io.h. 113 00:06:19,360 --> 00:06:20,760 Int main. 114 00:06:20,760 --> 00:06:26,330 En nu, in plaats van leegte, ik ga specificeren een int argc genaamd, en een 115 00:06:26,330 --> 00:06:28,780 array van strings genaamd argv. 116 00:06:28,780 --> 00:06:31,820 Nu, argc en argv zijn gewoon verdragen. 117 00:06:31,820 --> 00:06:34,000 >> We konden deze argumenten hebben genoemd meeste wat we willen. 118 00:06:34,000 --> 00:06:37,630 Maar wat belangrijk is, is dat argc een int omdat, per definitie, is 119 00:06:37,630 --> 00:06:41,360 gaat de telling argument bevatten, de aantal woorden dat de totale 120 00:06:41,360 --> 00:06:43,380 gebruiker heeft getypt op zijn of haar prompt. 121 00:06:43,380 --> 00:06:47,910 argv, ondertussen, argument vector, is naar een array opslaan eigenlijk 122 00:06:47,910 --> 00:06:52,020 alle woorden die de gebruiker heeft getypt op zijn of haar prompt. 123 00:06:52,020 --> 00:06:54,500 >> Laten we gaan nu iets doen met een of meer van deze 124 00:06:54,500 --> 00:06:55,660 command line argumenten. 125 00:06:55,660 --> 00:07:00,070 In het bijzonder, laten we verder gaan en druk welk woord de gebruiker typt 126 00:07:00,070 --> 00:07:03,960 achter de naam van het programma bij de prompt. 127 00:07:03,960 --> 00:07:04,730 Open beugel. 128 00:07:04,730 --> 00:07:06,240 Haakje sluiten. 129 00:07:06,240 --> 00:07:10,510 Printf procent s backslash en komma. 130 00:07:10,510 --> 00:07:14,550 En nu moet ik printf welke waarde vertellen aan te sluiten op die placeholder. 131 00:07:14,550 --> 00:07:18,600 Ik wil het eerste woord dat de gebruiker heeft getypt achter de naam van het programma, 132 00:07:18,600 --> 00:07:23,130 en dus ik ga om aan te geven argv beugel 1, dicht 133 00:07:23,130 --> 00:07:24,830 haakjes, puntkomma. 134 00:07:24,830 --> 00:07:27,290 >> Nu, waarom beugel 1 en niet beugel 0? 135 00:07:27,290 --> 00:07:30,990 Nou, het blijkt, automatisch opgeslagen in argv 0 gaat worden de 136 00:07:30,990 --> 00:07:32,620 werkelijke naam van het programma's. 137 00:07:32,620 --> 00:07:36,180 Dus het eerste woord dat de gebruiker typt achter de naam van het programma is, door 138 00:07:36,180 --> 00:07:38,990 conventie, zal worden opgeslagen in argv 1. 139 00:07:38,990 --> 00:07:42,380 Laten we nu samen te stellen en Dit programma starten. 140 00:07:42,380 --> 00:07:47,780 >> Maak argv 0, dot slash argv 0. 141 00:07:47,780 --> 00:07:50,520 En nu een woord als hallo. 142 00:07:50,520 --> 00:07:51,670 Enter. 143 00:07:51,670 --> 00:07:53,520 En daar hebben we het, hallo. 144 00:07:53,520 --> 00:07:55,750 >> [END VIDEO AFSPELEN] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: Oke. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Sluiten dat. 148 00:08:01,230 --> 00:08:16,730 Zodat het nemen van een kijkje op dat programma dat we gewoon aan ons voorgesteld, nou ja, gewoon 149 00:08:16,730 --> 00:08:24,710 om te laten zien, als we argv 0 drukken, maken, nu wat is het, argv 0, dot slash argv 0. 150 00:08:24,710 --> 00:08:30,440 Dus, zoals verwacht, het afdrukken van de de naam van het programma, aangezien argv 0 is 151 00:08:30,440 --> 00:08:32,970 altijd zal zijn de de naam van het programma. 152 00:08:32,970 --> 00:08:35,640 Maar laten we iets doen een beetje interessanter. 153 00:08:35,640 --> 00:08:42,080 >> Dus het probleem set, zult u geïntroduceerd om deze functie atoi. 154 00:08:42,080 --> 00:08:44,440 Dus wat doen we gebruiken atoi voor? 155 00:08:44,440 --> 00:08:48,550 Dat gaat zetten een string naar een integer. 156 00:08:48,550 --> 00:08:53,280 Dus als ik langs de string, een twee drie, te atoi, dat zal zetten dat 157 00:08:53,280 --> 00:08:56,910 aan integer, een twee drie. 158 00:08:56,910 --> 00:09:01,480 Dus we gaan om te zetten de eerste command line argument om een ​​geheel getal, 159 00:09:01,480 --> 00:09:05,690 en dan gewoon af te drukken dat integer. 160 00:09:05,690 --> 00:09:09,680 >> Dus eigenlijk, we zijn soort herimplementeren getint, alleen de 161 00:09:09,680 --> 00:09:12,350 integer is op het commando ingevoerd lijn in plaats van in het programma 162 00:09:12,350 --> 00:09:14,560 interactief. 163 00:09:14,560 --> 00:09:23,170 Zo dan, waardoor argv 0, laten we het doen het in hier, en sluit die. 164 00:09:23,170 --> 00:09:27,670 Dus lopen argv 0, en laten we voer de integer, een twee drie vier een twee. 165 00:09:27,670 --> 00:09:30,840 Dus het zal de integer te drukken, een twee drie vier een twee. 166 00:09:30,840 --> 00:09:35,500 Er zijn een aantal subtiliteiten te atoi dat het zal stoppen met zorgen te maken over iets 167 00:09:35,500 --> 00:09:39,040 dan geldig numeriek teken, maar dat maakt niet uit. 168 00:09:39,040 --> 00:09:42,870 >> Dus wat denk je dat er gebeurt als ik dit doe? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Segmentation fault. 171 00:09:47,050 --> 00:09:50,410 Dus waarom is dat? 172 00:09:50,410 --> 00:09:56,060 Als je terugkijkt naar ons programma, we zijn omzetten argv 1, het eerste argument 173 00:09:56,060 --> 00:09:59,610 na de naam van het programma, tot een geheel getal. 174 00:09:59,610 --> 00:10:03,350 Maar er is geen argument dat wordt doorgegeven na de naam van het programma. 175 00:10:03,350 --> 00:10:08,060 Dus hier zien we dat dit een buggy programma, omdat, als we proberen om het uit te voeren 176 00:10:08,060 --> 00:10:10,530 zonder argumenten, het zal alleen maar crashen. 177 00:10:10,530 --> 00:10:16,950 >> Dus een ander gemeenschappelijk patroon zie je is zoiets als, als argc minder 178 00:10:16,950 --> 00:10:21,100 dan twee, wat aangeeft dat er geen ten minste de naam en een programma 179 00:10:21,100 --> 00:10:29,100 eerste argument, dan gaan we iets doen zoals printf, niet genoeg 180 00:10:29,100 --> 00:10:31,190 command line argumenten. 181 00:10:31,190 --> 00:10:33,170 Dat is waarschijnlijk niet een goede om af te drukken, het is waarschijnlijk iets, zoals 182 00:10:33,170 --> 00:10:35,440 moet u een geheel getal invoeren op de opdrachtregel. 183 00:10:35,440 --> 00:10:37,450 Ik zal gewoon uiteindelijk het daar. 184 00:10:37,450 --> 00:10:39,600 En dan terug 1. 185 00:10:39,600 --> 00:10:44,740 Dus denk eraan dat aan het einde van onze programma, als we 0 terug, dat soort 186 00:10:44,740 --> 00:10:47,060 geeft aan succes. 187 00:10:47,060 --> 00:10:50,940 En main ook automatisch geeft 0 als je dat niet. 188 00:10:50,940 --> 00:10:55,800 >> Dus hier zijn we opnieuw afstemmen 1 om aan te geven dat dat niet succes. 189 00:10:55,800 --> 00:11:01,000 En je kunt terugkeren wat je wilt, net, 0 geeft succes, en 190 00:11:01,000 --> 00:11:03,390 iets anders aangeeft mislukking. 191 00:11:03,390 --> 00:11:04,855 Dus laten we lopen deze versie van de dingen. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Dus nu, als we niet een opdrachtregel in te voeren argument, zal het juist vertellen 194 00:11:16,600 --> 00:11:18,290 ons, niet genoeg command line. 195 00:11:18,290 --> 00:11:20,610 Heeft de zin niet af. 196 00:11:20,610 --> 00:11:24,950 Anders, als we eigenlijk pas het een, kan het programma compleet. 197 00:11:24,950 --> 00:11:27,920 Dus dit is hoe je argc zou gebruiken in Om het aantal valideren 198 00:11:27,920 --> 00:11:30,630 command line argumenten die ook worden doorberekend. 199 00:11:30,630 --> 00:11:39,360 >> Dus laten we dit programma een beetje meer ingewikkeld, en kijk naar de tweede 200 00:11:39,360 --> 00:11:42,180 iteratie van de dingen. 201 00:11:42,180 --> 00:11:46,310 Dus nu zijn we niet alleen het afdrukken van de eerste command line argument. 202 00:11:46,310 --> 00:11:51,210 Hier zijn we itereren van int i gelijken 0, i minder dan argc, i plus 203 00:11:51,210 --> 00:11:55,280 plus, en afdrukken argv, index i. 204 00:11:55,280 --> 00:11:59,300 Dus dit patroon nogmaals, dit is hetzelfde patroon als hiervoor, behalve in plaats 205 00:11:59,300 --> 00:12:02,600 van het aanroepen van de variabele n, gebruiken we argc. 206 00:12:02,600 --> 00:12:09,520 >> Dus dit is itereren over elke index in de array, en afdrukken van elk 207 00:12:09,520 --> 00:12:11,910 element in die array. 208 00:12:11,910 --> 00:12:20,300 En ja, wanneer we dit programma uitvoert, goed, Ik heb geen command line niet betreden 209 00:12:20,300 --> 00:12:22,540 argumenten, zodat het net prints de naam van het programma. 210 00:12:22,540 --> 00:12:26,053 Als ik een hoop dingen, het zal U kunt een, elk op zijn eigen lijn. 211 00:12:26,053 --> 00:12:31,213 212 00:12:31,213 --> 00:12:32,210 >> OK. 213 00:12:32,210 --> 00:12:34,770 Dus laten we nog een stap verder. 214 00:12:34,770 --> 00:12:38,890 En in plaats van het afdrukken van elk argument op zijn eigen lijn, laten we elkaar drukken 215 00:12:38,890 --> 00:12:42,590 karakter van elk argument op zijn eigen lijn. 216 00:12:42,590 --> 00:12:46,700 Dus onthoud dat argv een array van strings. 217 00:12:46,700 --> 00:12:50,960 Dus wat is een string, maar een array van karakters? 218 00:12:50,960 --> 00:12:57,140 Dus dat betekent dat argv is echt een matrix van een array van karakters. 219 00:12:57,140 --> 00:13:04,920 Dus het voordeel dat, laten we negeren dit voor nu. 220 00:13:04,920 --> 00:13:08,190 Laten we maar eens kijken naar de string argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Dus als we willen om elk teken voor brengen argv 0 op zijn eigen lijn, dan wil ik 222 00:13:14,170 --> 00:13:19,500 om het patroon dat we gewend zijn te doen, i minder dan de lengte van de array, 223 00:13:19,500 --> 00:13:23,990 die hier wordt strlen van, dat is niet wat ik wil doen, touwtje 224 00:13:23,990 --> 00:13:26,450 s gelijk argv 0. 225 00:13:26,450 --> 00:13:30,390 Dus i kleiner is dan de lengte van ons matrix, die in dit geval een matrix 226 00:13:30,390 --> 00:13:34,410 karakters, i plus plus. 227 00:13:34,410 --> 00:13:41,040 En dus, zoals we zagen vorige week, is het ideaal als we gaan die buiten strlen 228 00:13:41,040 --> 00:13:45,210 van de voorwaarde, aangezien n het toevoegen de strlen van s elke keer dat we gaan 229 00:13:45,210 --> 00:13:47,720 door de lus, en het is niet van plan te veranderen. 230 00:13:47,720 --> 00:13:50,230 Dus zullen we het gelijk aan n hier stellen. 231 00:13:50,230 --> 00:13:54,260 232 00:13:54,260 --> 00:13:55,170 >> OK. 233 00:13:55,170 --> 00:14:01,320 Dus nu zijn we itereren over elke index in de array. 234 00:14:01,320 --> 00:14:05,630 En dus, als we willen elke afdrukken tekens in die matrix, percenten c 235 00:14:05,630 --> 00:14:06,880 de vlag die we willen gebruiken voor karakters. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 En nu een beugel i gaat worden de snaar, index karakter i, dus als de 238 00:14:19,770 --> 00:14:20,970 koord waren hello. 239 00:14:20,970 --> 00:14:27,530 dan is 0 gaat h bedragen, s beugel 1 zal e, enzovoort. 240 00:14:27,530 --> 00:14:30,800 >> Dus nu willen we combineren deze twee dingen. 241 00:14:30,800 --> 00:14:35,440 We willen elk personage afdrukken van elke command line argument. 242 00:14:35,440 --> 00:14:38,950 Dus we zullen moeten een geneste lus. 243 00:14:38,950 --> 00:14:47,480 En conventioneel, de eerste teller i is, de volgende zal zijn j, n 244 00:14:47,480 --> 00:14:54,450 zal de strlen van argv i zijn, i is kleiner dan n, i plus plus. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 En nu in plaats van druk argv i, dus argv beugel i gaat index - 247 00:15:06,870 --> 00:15:14,280 dat gaat om het i-de command line worden argument, argv i, j gaat 248 00:15:14,280 --> 00:15:16,925 als jde karakter het i-de argument. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Ik zal zich te ontdoen van dit hier nu omdat we het in die lus. 251 00:15:24,810 --> 00:15:33,900 Dus is gelijk aan tekenreeks s gelijken argv i, en dan j s beugel. 252 00:15:33,900 --> 00:15:36,980 >> Nou, we hoeven niet te verklaren deze variabele s. 253 00:15:36,980 --> 00:15:44,530 In plaats daarvan, zullen we gewoon deze combineren twee in wat we hadden, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> LUIDSPREKER 1: [onverstaanbaar]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: Goed gesprek. 257 00:15:49,680 --> 00:15:52,936 Dus dit is gebroken. 258 00:15:52,936 --> 00:15:55,510 Als ik eigenlijk liep, zouden we hebben gerealiseerd. 259 00:15:55,510 --> 00:16:01,210 Dus de balie waar ik om geef in dit voor 260 00:16:01,210 --> 00:16:05,410 lus is j, de iterator. 261 00:16:05,410 --> 00:16:08,560 Dus u zou hebben problemen optreden, waarschijnlijk een oneindige lus, als we 262 00:16:08,560 --> 00:16:09,540 had niet vast dat. 263 00:16:09,540 --> 00:16:12,220 Dat is waarom we ook praten over het debuggen van vandaag. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Dus laten we lopen dit programma. 266 00:16:15,240 --> 00:16:21,200 En laten we daadwerkelijk toe te voegen een aparte printf hier die maar af te drukken 267 00:16:21,200 --> 00:16:27,480 een andere lijn, aangezien dit betekent dat wanneer we start het programma, zal er een leeg 268 00:16:27,480 --> 00:16:31,830 lijn tussen elk teken van elke command line argument. 269 00:16:31,830 --> 00:16:33,448 Nou, we zullen zien wat dat betekent. 270 00:16:33,448 --> 00:16:37,310 271 00:16:37,310 --> 00:16:37,790 Oop. 272 00:16:37,790 --> 00:16:39,870 Ik kreeg een aantal bug. 273 00:16:39,870 --> 00:16:42,860 Fout impliciet verklaren bibliotheekfunctie strlen. 274 00:16:42,860 --> 00:16:51,630 >> Dus terug in ons programma, ik vergat om hash bevatten string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 Dus string.h gaat worden de header-bestand dat verklaart 277 00:16:57,730 --> 00:16:58,980 de functie strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, het compileert. 280 00:17:06,060 --> 00:17:09,109 Nu, laten we lopen het. 281 00:17:09,109 --> 00:17:10,930 Dus gewoon dat. 282 00:17:10,930 --> 00:17:17,790 Het gaat om afdrukken onze programmanaam, hello wereld. 283 00:17:17,790 --> 00:17:23,510 Het gaat om elk ding te printen, elk karakter, op een afzonderlijke regel. 284 00:17:23,510 --> 00:17:24,540 OK. 285 00:17:24,540 --> 00:17:30,625 >> Dus laten we eigenlijk dit nemen een stap verder. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 En in plaats van het gebruik van string.h, laten we nadenken over hoe we onze eigen zouden implementeren 288 00:17:39,700 --> 00:17:41,420 strlen functie. 289 00:17:41,420 --> 00:17:45,600 Dus ik zal onmiddellijk geven een functie handtekening. 290 00:17:45,600 --> 00:17:52,900 Dus laten we noemen in my_strlen, en het is gaat om een ​​string te nemen als argument, 291 00:17:52,900 --> 00:17:57,220 en we verwachten dat de terugkeer van de lengte van die string. 292 00:17:57,220 --> 00:18:03,430 Dus, waar is die vent? 293 00:18:03,430 --> 00:18:04,990 Ja. 294 00:18:04,990 --> 00:18:06,740 OK. 295 00:18:06,740 --> 00:18:12,900 Dus onthoud van de eerdere dia die was ook van vorige week, dat een 296 00:18:12,900 --> 00:18:18,890 scala aan personages, nou ja, een string, dus laten we zeggen dat dit onze tekenreeks s. 297 00:18:18,890 --> 00:18:29,870 Dus als s is de string, hello, dan, H-E-L-L-O, in het geheugen, dat gaat 298 00:18:29,870 --> 00:18:35,610 zijn, en dan dit backslash 0 karakter. 299 00:18:35,610 --> 00:18:39,170 >> Dus hoe krijgen we de lengte van s? 300 00:18:39,170 --> 00:18:43,190 Nou, de truc is op zoek naar deze terugslag 0 karakter, deze null 301 00:18:43,190 --> 00:18:44,380 terminator. 302 00:18:44,380 --> 00:18:50,270 Dus het algoritme Gaat iets als weinigen 303 00:18:50,270 --> 00:18:51,510 genoeg tekens die - 304 00:18:51,510 --> 00:18:56,180 laten we deze hand vertegenwoordigen ongeveer teller, laten we noemen dit int lengte. 305 00:18:56,180 --> 00:19:00,060 Dus, vanaf hier zijn we gaan itereren over onze string. 306 00:19:00,060 --> 00:19:04,100 >> Dus het eerste teken, het is H, en het is niet terug slash 0, dus 307 00:19:04,100 --> 00:19:05,170 de lengte 1. 308 00:19:05,170 --> 00:19:08,050 Herhalen om het volgende teken, E, en het is niet backslash 0. 309 00:19:08,050 --> 00:19:09,630 Lengte is 2. 310 00:19:09,630 --> 00:19:10,960 L, 3. 311 00:19:10,960 --> 00:19:11,850 L, 4. 312 00:19:11,850 --> 00:19:13,050 O, 5. 313 00:19:13,050 --> 00:19:16,690 En tenslotte, backslash bereiken we 0, en dus dat betekent, goed, 314 00:19:16,690 --> 00:19:17,780 deze string is voorbij. 315 00:19:17,780 --> 00:19:20,130 Dus laten we terugkeren 5. 316 00:19:20,130 --> 00:19:33,630 >> Dus eigenlijk uitvoering van dat, ten eerste, mijn n lengte gelijk is aan 0, mijn rechterhand. 317 00:19:33,630 --> 00:19:36,088 En we gaan herhalen - 318 00:19:36,088 --> 00:19:38,000 >> LUIDSPREKER 1: [onverstaanbaar] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Oh, schieten. 320 00:19:38,640 --> 00:19:39,870 Goed gesprek. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Zo n lengte gelijk is aan 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Dus nu, terwijl s lengte niet gelijk en dan, backslash 0. 325 00:19:58,310 --> 00:20:04,660 Dus denk eraan, dit backslash 0, het is een werkelijke karakter, en het geeft 326 00:20:04,660 --> 00:20:05,820 het einde van de string. 327 00:20:05,820 --> 00:20:09,850 Net als, ook, backslash n is een echte karakter. 328 00:20:09,850 --> 00:20:14,040 Backslash 0 gaat om aan te geven het einde van onze string. 329 00:20:14,040 --> 00:20:15,414 Ik wil niet daar we deze. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 En terwijl s geïndexeerd lengte niet gelijk aan de null-terminator, dan 332 00:20:25,620 --> 00:20:27,130 we gaan gewoon op lengte te verhogen. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Zo dan, aan het einde van ons programma, lengte uiteindelijk zal 335 00:20:34,880 --> 00:20:37,610 5 zijn in dit geval. 336 00:20:37,610 --> 00:20:39,210 En we gaan gewoon terug lengte. 337 00:20:39,210 --> 00:20:42,570 338 00:20:42,570 --> 00:20:43,530 >> OK. 339 00:20:43,530 --> 00:20:48,290 Dus nu hier beneden, ik niet doen my_strlen. 340 00:20:48,290 --> 00:20:50,700 Laten we compileren om ervoor te zorgen alles op rolletjes loopt. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Deed ik in 2? 343 00:20:58,210 --> 00:21:00,565 Of was dat 1? 344 00:21:00,565 --> 00:21:01,940 Dat zou moeten doen. 345 00:21:01,940 --> 00:21:02,690 Oke. 346 00:21:02,690 --> 00:21:08,490 Dus dit is argv 2. 347 00:21:08,490 --> 00:21:11,585 Werkt zoals verwacht, hoewel was dat degene die ik deed het in? 348 00:21:11,585 --> 00:21:15,060 349 00:21:15,060 --> 00:21:15,550 Ja. 350 00:21:15,550 --> 00:21:16,760 OK. 351 00:21:16,760 --> 00:21:21,820 Deze versie van de dingen niet hoefde de printf nieuwe regel na, maar het 352 00:21:21,820 --> 00:21:22,910 maakt geen verschil maken. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 Dus werkte zoals verwacht. 355 00:21:25,780 --> 00:21:34,750 >> Nu kunnen we zelfs nog een stap te combineren verder, indien een aankondiging hier, goed, 356 00:21:34,750 --> 00:21:38,920 eerste, we grijpen de strlen van argv i, en dan zijn we itereren over 357 00:21:38,920 --> 00:21:41,450 elk teken in die string. 358 00:21:41,450 --> 00:21:47,480 Dus in plaats van dat te doen, wat als we gewoon combineren deze logica van het wachten 359 00:21:47,480 --> 00:21:50,740 totdat wij slaan backslash 0 rechts in deze for-lus? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Dus herhalen terwijl argv i, j doet niet gelijk backslash 0. 362 00:22:07,490 --> 00:22:10,680 Dus laten we eerst voer het uit. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Oke. 365 00:22:21,180 --> 00:22:27,655 Dus hier, wordt deze voorwaarde te zeggen - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 Laten we duidelijk zijn dat. 368 00:22:40,060 --> 00:22:49,140 Dus nu, laat dit onze argv. 369 00:22:49,140 --> 00:22:55,290 Dus toen liep ik net dat programma voor, argv is een array van strings. 370 00:22:55,290 --> 00:23:03,100 En dus, als ik zonder het met dot slash argv 2, hallo wereld, dan de argv 371 00:23:03,100 --> 00:23:07,650 zelf is de lengte 3, voor argv nul, hello, en de wereld. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> En de binnenkant van elk van deze indices, zelf een array, waar dit zal zijn 374 00:23:19,660 --> 00:23:23,780 stip, dit zal slash zijn, weet ik niet als dat de goede richting, ik 375 00:23:23,780 --> 00:23:25,680 denk niet dat het was. 376 00:23:25,680 --> 00:23:30,110 A-R-V dash, meer ruimte nodig. 377 00:23:30,110 --> 00:23:32,570 Laten we gesneden in deze array. 378 00:23:32,570 --> 00:23:38,230 A-R-V dash 0, en vervolgens backslash 0. 379 00:23:38,230 --> 00:23:43,160 En dan in de war zal zijn hello. 380 00:23:43,160 --> 00:23:45,910 Laten we zeggen, H-E backslash 0. 381 00:23:45,910 --> 00:23:51,130 En tenslotte, W-O backslash 0. 382 00:23:51,130 --> 00:23:59,730 >> Zodat het algoritme dat we net schreef, de geneste for-lussen, wat ze 383 00:23:59,730 --> 00:24:07,321 doen is, moeten we eerst de i en j tegen te gaan. 384 00:24:07,321 --> 00:24:15,206 Dit zou makkelijker met code op het s scherm, laten we terug naar deze te gaan. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 Zo merken dat i de iterator dat is itereren over elke opdracht 387 00:24:24,600 --> 00:24:25,610 lijn argument. 388 00:24:25,610 --> 00:24:28,870 En j is de iterator iteratie over elk personage in dat 389 00:24:28,870 --> 00:24:30,410 command line argument. 390 00:24:30,410 --> 00:24:46,755 Dus wat dit binnenste printf doet is, hebben we argv 0 0, printf printf 391 00:24:46,755 --> 00:24:58,680 argv 0 1, printf argv 0 2 0 3 0 4 0 5, 0 6, maar nu, argv 0 7 gaat 392 00:24:58,680 --> 00:25:00,670 gelijke backslash 0. 393 00:25:00,670 --> 00:25:05,730 >> Dus dan dat verlaten we voor loop, en nu heb ik herhaalt tot 1. 394 00:25:05,730 --> 00:25:10,910 En nu gaan we om af te drukken argv 1 0, argv 1 1 - 395 00:25:10,910 --> 00:25:17,040 goed, nu, want ik snijd hello kort, argv 1 2 weer gaat worden 396 00:25:17,040 --> 00:25:18,170 backslash 0. 397 00:25:18,170 --> 00:25:25,050 En dus, in stappen i en voort te zetten, en zo verder, totdat we printen alle 398 00:25:25,050 --> 00:25:28,580 wereld, en dat zijn drie opdrachtregel argumenten, en we zullen verlaten van 399 00:25:28,580 --> 00:25:31,670 de buitenste lus, en eindigen onze programma. 400 00:25:31,670 --> 00:25:38,390 401 00:25:38,390 --> 00:25:39,640 OK. 402 00:25:39,640 --> 00:25:43,903 403 00:25:43,903 --> 00:25:46,795 >> Dus laten we hier terug te komen. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Dus je zult enige vertrouwdheid met winnen command line argumenten op deze 406 00:25:52,370 --> 00:25:54,460 bijzonder probleem stellen. 407 00:25:54,460 --> 00:25:56,630 >> Nu, debuggen. 408 00:25:56,630 --> 00:26:01,680 Dus heb je waarschijnlijk al moest doen sommige debuggen met uw vorige 409 00:26:01,680 --> 00:26:03,120 probleem stellen. 410 00:26:03,120 --> 00:26:08,420 En een zeer eenvoudige manier van debuggen, laten we eerst eens kijken naar een buggy programma. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Nou, wandelen door dit programma, we gaan naar de gebruiker voor een vraag 413 00:26:23,830 --> 00:26:29,350 integer, pak dat integer, en dan, willekeurig, we hebben een tijdje lus die 414 00:26:29,350 --> 00:26:32,280 is gewoon te verlagen i totdat het is gelijk aan 10. 415 00:26:32,280 --> 00:26:35,820 Laten we aannemen dat ik het invoeren een geheel getal groter dan 10. 416 00:26:35,820 --> 00:26:38,700 Dus verlagen i totdat het gelijk is aan 10. 417 00:26:38,700 --> 00:26:42,630 >> En dan hebben we nog een tijdje lus dat, terwijl ik niet gelijk 0, we zijn 418 00:26:42,630 --> 00:26:44,540 ga i verlagen door 3. 419 00:26:44,540 --> 00:26:49,790 Dus als je de intentie van de bug hier, het is dat dit zal verlagen i te 420 00:26:49,790 --> 00:26:57,010 zijn 10, en dan is deze while loop wil decrement i van 10, 7, 4, 1, 421 00:26:57,010 --> 00:27:02,880 negatieve 2, negatieve 5, enzovoort, naar negatief oneindig, want ik zal 422 00:27:02,880 --> 00:27:05,920 eigenlijk nooit gelijk 0. 423 00:27:05,920 --> 00:27:08,610 En vervolgens aan het eind van dit programma, we hebben de foo functie die 424 00:27:08,610 --> 00:27:12,130 gaande uitdraai die ik. 425 00:27:12,130 --> 00:27:16,520 >> Dus dit is een korte en triviale programma, en de bug is duidelijk, 426 00:27:16,520 --> 00:27:18,790 vooral nadat ik net gezegd wat de bug was. 427 00:27:18,790 --> 00:27:24,840 Maar de bedoeling hier is, nou ja, dit zou eigenlijk uit een aantal van uw 428 00:27:24,840 --> 00:27:30,040 oplossingen van hebzuchtige uit de laatste probleem stellen, en misschien moet je wel 429 00:27:30,040 --> 00:27:32,800 sommige oneindige lus in uw programma, en je hebt geen idee 430 00:27:32,800 --> 00:27:34,100 wat de oorzaak is. 431 00:27:34,100 --> 00:27:38,690 Dus een zeer nuttige debugging techniek is om gewoon printfs voegen 432 00:27:38,690 --> 00:27:40,180 over je code. 433 00:27:40,180 --> 00:27:49,200 >> Dus hier wil ik een printf buiten eerste while lus. 434 00:27:49,200 --> 00:27:53,155 En hier wil ik een printf, en ik zal gewoon uitprinten i. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Ik zal zelfs eerst doen terwijl lus, i. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 Buiten, tweede while lus. 439 00:28:09,040 --> 00:28:12,170 Nogmaals, afdrukken binnen van hier, de waarde i. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 En laten we dit uitvoeren. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> Dus dot slash debug. 444 00:28:24,800 --> 00:28:25,610 Voer een geheel getal. 445 00:28:25,610 --> 00:28:28,150 Laten we het doen 13. 446 00:28:28,150 --> 00:28:28,760 En giek. 447 00:28:28,760 --> 00:28:33,300 We zien dat we oneindig looping binnenkant van de tweede while lus. 448 00:28:33,300 --> 00:28:36,305 Dus nu weten we wat de bug is. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Maar printf debugging is perfect geweldig, maar zodra je programma's te krijgen 451 00:28:45,610 --> 00:28:50,560 langer en ingewikkelder, er meer geavanceerde oplossingen 452 00:28:50,560 --> 00:28:51,705 getting things werken. 453 00:28:51,705 --> 00:28:52,955 Dus laten verwijderen al deze printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 En laten we ervoor zorgen dat ik niet breken iets. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Zodat het programma gaan we invoeren heet 458 00:29:14,180 --> 00:29:16,715 GDB, voor GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Nou, laten we verwijderen debug voor een tweede, en opnieuw maken debug. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Nou, eigenlijk voor het eerst, een goede les in de command line argumenten. 463 00:29:34,440 --> 00:29:37,780 Merk op dat deze Clang opdracht die compileren alles wordt doorgegeven 464 00:29:37,780 --> 00:29:41,300 op de opdrachtregel, deze command line argumenten. 465 00:29:41,300 --> 00:29:46,250 Dus precies hoe je gaat worden met behulp van command line argumenten, zoals we 466 00:29:46,250 --> 00:29:51,500 eerder deed, en zoals u zult in PSET 2, dat is hoe Clang is het gebruik ervan. 467 00:29:51,500 --> 00:30:00,070 >> Zo merken dat deze eerste vlag, dash ggdb3, wat dat is te zeggen, Clang, 468 00:30:00,070 --> 00:30:03,790 U moet dit bestand met het compileren bedoeling dat wij uiteindelijk zullen 469 00:30:03,790 --> 00:30:05,380 nodig om het te debuggen. 470 00:30:05,380 --> 00:30:13,840 Dus zolang je die vlag, dan kunnen we GDB debuggen. 471 00:30:13,840 --> 00:30:17,380 En het zal het openstellen van de GNU Debugger. 472 00:30:17,380 --> 00:30:22,920 >> Dus er zijn een heleboel opdrachten die je nodig hebt om te wennen aan. 473 00:30:22,920 --> 00:30:27,100 Eerste dat je waarschijnlijk direct nodig is Run. 474 00:30:27,100 --> 00:30:28,200 Dus wat is Run gaat doen? 475 00:30:28,200 --> 00:30:30,910 Het gaat om ons programma te starten. 476 00:30:30,910 --> 00:30:36,180 Dus ren, te beginnen, het programma vraagt ​​ons voor een geheel getal van 13. 477 00:30:36,180 --> 00:30:39,170 En dan is het oneindig looping als verwacht, behalve dat ik verwijderde de 478 00:30:39,170 --> 00:30:40,500 printfs, zodat we niet eens zien. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Normaal verlaten. 481 00:30:44,600 --> 00:30:45,850 Oh. 482 00:30:45,850 --> 00:30:48,570 483 00:30:48,570 --> 00:30:53,640 Het is mogelijk dat het verpakt alle weg, terug naar - negeren dat. 484 00:30:53,640 --> 00:30:55,170 Neem aan dat het niet normaal af te sluiten. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Er is een ingewikkeld antwoord. 487 00:31:03,370 --> 00:31:07,890 >> Dus nu, dat is niet erg handig. 488 00:31:07,890 --> 00:31:11,480 Dus gewoon het runnen van onze programma binnenkant van deze debugger helpt ons niet in een 489 00:31:11,480 --> 00:31:15,610 manier, omdat we net hadden kunnen doen dot slash debug van buiten GDB. 490 00:31:15,610 --> 00:31:21,250 Dus de ene opdracht die U zult waarschijnlijk - 491 00:31:21,250 --> 00:31:22,970 en Ik zal dit stoppen. 492 00:31:22,970 --> 00:31:25,850 Controle-d of stoppen, zowel werk. 493 00:31:25,850 --> 00:31:29,550 Dus laten we openen weer op. 494 00:31:29,550 --> 00:31:31,130 >> Een andere opdracht die u zult waarschijnlijk onmiddellijk wilt 495 00:31:31,130 --> 00:31:33,600 wennen is Break. 496 00:31:33,600 --> 00:31:37,120 Dus we zullen op de belangrijkste breken voor nu, en dan zal ik uitleggen. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Nou, hier zien we we een breekpunt op deze lijn in debug.c. 499 00:31:46,370 --> 00:31:50,160 Dus wat breuk betekent is dat wanneer ik Typ run, is het programma gaat 500 00:31:50,160 --> 00:31:53,560 blijven draaien totdat Ik raakte een breekpunt. 501 00:31:53,560 --> 00:31:59,390 Dus toen ik raakte run, het programma begint, en dan breekt zodra 502 00:31:59,390 --> 00:32:01,940 komt in de belangrijkste functie. 503 00:32:01,940 --> 00:32:06,930 Break belangrijkste gaat iets worden je behoorlijk vaak doen. 504 00:32:06,930 --> 00:32:11,340 >> En nu, om u kennis om wat meer commando's. 505 00:32:11,340 --> 00:32:14,330 Let hier op, dat het is te zeggen dat we brak op lijn 11, die is 506 00:32:14,330 --> 00:32:16,230 printf, voer een geheel getal. 507 00:32:16,230 --> 00:32:21,260 Dus het commando Volgende gaat worden hoe gaan we naar de volgende regel code. 508 00:32:21,260 --> 00:32:24,810 Dit zal ons toelaten om stap door middel van ons programma regel voor regel. 509 00:32:24,810 --> 00:32:26,260 Dus de volgende. 510 00:32:26,260 --> 00:32:29,820 >> Nu lijn 12, we gaan de integer krijgen. 511 00:32:29,820 --> 00:32:30,450 Volgende. 512 00:32:30,450 --> 00:32:34,290 En als je gewoon op weer invoeren, het zal opnieuw het laatste wat je hebt gedaan. 513 00:32:34,290 --> 00:32:36,480 Dus ik hoef niet te typen volgende elke keer. 514 00:32:36,480 --> 00:32:40,100 Dus vul een geheel getal van 13. 515 00:32:40,100 --> 00:32:46,940 Dus nu, lijn 14, terwijl ik groter dan 10, en ik zal doen. 516 00:32:46,940 --> 00:32:48,685 En we zien we gaan i verlagen. 517 00:32:48,685 --> 00:32:50,210 Dus we gaan ik opnieuw verlagen. 518 00:32:50,210 --> 00:32:53,620 >> Dus nu, een andere nuttige opdracht Afdrukken. 519 00:32:53,620 --> 00:32:55,750 Dus Print gaat om uit te printen de waarde van de variabele. 520 00:32:55,750 --> 00:32:57,825 Laten we brengen de waarde van variabele i. 521 00:32:57,825 --> 00:32:58,705 Laten we drukken i. 522 00:32:58,705 --> 00:33:00,910 Het zal zeggen dat ik is 11. 523 00:33:00,910 --> 00:33:03,330 Nu opnieuw op Volgende we tijdens i groter is dan 10. 524 00:33:03,330 --> 00:33:05,590 Dus ik is nog steeds groter dan 10, aangezien het 11. 525 00:33:05,590 --> 00:33:06,920 i minus minus. 526 00:33:06,920 --> 00:33:08,250 Laten we opnieuw af i. 527 00:33:08,250 --> 00:33:10,950 Zoals verwacht, is het 10. 528 00:33:10,950 --> 00:33:12,510 >> Dus nu, naast. 529 00:33:12,510 --> 00:33:16,250 Het is terug naar de staat gaan, i groter dan 10, maar ik is nu 10, dus 530 00:33:16,250 --> 00:33:20,040 het is niet meer dan 10, dus we verwachten het uit de while-lus te vallen. 531 00:33:20,040 --> 00:33:22,220 En nu zijn we onder die regel code. 532 00:33:22,220 --> 00:33:28,750 En een andere opdracht, List, wordt gewoon naar de vorige en volgende weer te geven 533 00:33:28,750 --> 00:33:31,240 paar regels code, in geval je jezelf verloren. 534 00:33:31,240 --> 00:33:35,420 Dus we verlieten deze while lus, en nu hebben we dit ingevoerd 535 00:33:35,420 --> 00:33:37,080 terwijl lus, lijn 18. 536 00:33:37,080 --> 00:33:39,860 Dus terwijl ik niet gelijk is aan 0. 537 00:33:39,860 --> 00:33:46,570 En, volgende, ik gelijk i min 3, en we zullen opmerken, zullen dit gewoon doorgaan. 538 00:33:46,570 --> 00:33:48,270 En we kunnen i drukken. 539 00:33:48,270 --> 00:33:49,990 >> Elke opdracht heeft een soort van snelkoppelingen. 540 00:33:49,990 --> 00:33:51,720 Dus p is een afkorting voor Print. 541 00:33:51,720 --> 00:33:53,400 Dus we kunnen p i. 542 00:33:53,400 --> 00:33:57,550 Gewoon blijven vasthouden n, of blijven doen Volgende. 543 00:33:57,550 --> 00:33:58,340 Print ik opnieuw. 544 00:33:58,340 --> 00:34:00,380 Je ziet nu dat het negatieve 167. 545 00:34:00,380 --> 00:34:06,030 Dus dit zal eeuwig doorgaan, maar niet echt altijd, omdat je net zag, het 546 00:34:06,030 --> 00:34:09,330 daadwerkelijk zal eindigen op een bepaald punt. 547 00:34:09,330 --> 00:34:15,699 >> Dus dat is Beginning GDB. 548 00:34:15,699 --> 00:34:19,504 Maar laten we een ding in GDB. 549 00:34:19,504 --> 00:34:20,754 Uh, debuggen. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Dus, in dit geval, de oneindige lus toevallig binnenkant van 552 00:34:28,534 --> 00:34:30,050 de belangrijkste functie. 553 00:34:30,050 --> 00:34:35,779 En voor nu, gewoon accepteren dat ik ben gaan naar de oneindige lus te verplaatsen naar 554 00:34:35,779 --> 00:34:37,029 de foo functie. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Vergeet niet dat, aan het einde van deze programma, goed, dit was oorspronkelijk 557 00:34:43,730 --> 00:34:46,210 bellen foo, die net was gaat i te drukken. 558 00:34:46,210 --> 00:34:51,880 Maar nu zijn we bellen foo, dat is ga ik verlagen tot het 0, en 559 00:34:51,880 --> 00:34:54,548 vervolgens afdrukken die variabele. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Behalve dat. 562 00:34:57,970 --> 00:35:00,175 Maken debug. 563 00:35:00,175 --> 00:35:03,310 En nu, gdb debuggen. 564 00:35:03,310 --> 00:35:04,090 OK. 565 00:35:04,090 --> 00:35:10,580 >> Dus als ik gewoon lopen, dan ga ik niet naar in staat zijn om daadwerkelijk stappen door mijn 566 00:35:10,580 --> 00:35:11,730 programma lijn per lijn. 567 00:35:11,730 --> 00:35:19,820 Dus laten we breken op hoofd, en typ run. 568 00:35:19,820 --> 00:35:28,160 Dus door deze, printf, voer een geheel getal, krijgen de integer, 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Dus we gaan verlagingsfuncties houden tot i groter is dan 10. 571 00:35:37,490 --> 00:35:42,840 Dan gaan we vallen door de while loop, en maak kennis met de lijn - 572 00:35:42,840 --> 00:35:44,364 laten openen in een apart venster. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Dus we verlaagd tot ik niet meer groter dan 10, en dan hebben we 575 00:35:53,300 --> 00:35:55,700 genaamd de functie foo. 576 00:35:55,700 --> 00:36:01,340 >> Dus wat is er gebeurd zodra ik hit function foo, goed, ik belde foo, en 577 00:36:01,340 --> 00:36:04,030 dan had ik niet langer controle over GDB. 578 00:36:04,030 --> 00:36:10,230 Dus zodra ik hit Volgende op deze lijn, dingen voortgezet tot dit gebeurde, 579 00:36:10,230 --> 00:36:12,400 waar het programma verlaten wanneer - 580 00:36:12,400 --> 00:36:14,450 neem aan dat het niet uiteindelijk bestaan. 581 00:36:14,450 --> 00:36:16,390 Je zag het pauzeren voor een beetje maar. 582 00:36:16,390 --> 00:36:22,040 Dus waarom heb ik de controle over verliezen het programma op dat punt? 583 00:36:22,040 --> 00:36:27,540 Nou, als ik typ de volgende, dat gaat naar de letterlijke volgende regel code die 584 00:36:27,540 --> 00:36:28,850 zal uitvoeren. 585 00:36:28,850 --> 00:36:35,950 Dus na lijn 21, de volgende regel code dat zal uitvoeren is lijn 22, 586 00:36:35,950 --> 00:36:38,520 dat is, het verlaten van de belangrijkste. 587 00:36:38,520 --> 00:36:43,810 Dus ik wil niet alleen gaan naar de volgende regel code. 588 00:36:43,810 --> 00:36:48,170 Ik wil in de functie, foo te gaan, en dan ook nog te doorlopen 589 00:36:48,170 --> 00:36:49,830 die regels code. 590 00:36:49,830 --> 00:36:53,726 >> Dus voor dat, hebben we een alternatief. 591 00:36:53,726 --> 00:36:56,770 Laten we stoppen met dat weer. 592 00:36:56,770 --> 00:36:58,020 Breken belangrijkste. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, volgende, volgende, 13, volgende, next, next, voorzichtig, 595 00:37:06,370 --> 00:37:09,820 voordat we op lijn foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> Dus nu zijn we op lijn 21, waar we foo noemen. 598 00:37:13,700 --> 00:37:17,100 We willen niet de volgende typen, want dat gewoon bellen met de functie foo, en 599 00:37:17,100 --> 00:37:18,710 ga naar de volgende regel code. 600 00:37:18,710 --> 00:37:20,840 Wat we willen gebruiken is Step. 601 00:37:20,840 --> 00:37:25,690 Dus er is een verschil tussen Step en Next, waar Step stapt in de 602 00:37:25,690 --> 00:37:28,190 functioneren, en Next gaat over de functie. 603 00:37:28,190 --> 00:37:32,830 Het voert alleen het geheel van de functie en blijft gaan. 604 00:37:32,830 --> 00:37:37,210 >> Dus stap gaat ons brengen in de functie, foo. 605 00:37:37,210 --> 00:37:41,160 En wij zien hier, nu, zijn we terug bij dit terwijl lus die, in theorie, 606 00:37:41,160 --> 00:37:44,190 voor altijd blijven. 607 00:37:44,190 --> 00:37:50,420 En als je stap, wanneer het niet eens raken een functie om te bellen, dan is 608 00:37:50,420 --> 00:37:51,720 identiek aan Next. 609 00:37:51,720 --> 00:37:55,320 Dus het is alleen als je op een lijn die roept een functie die stap 610 00:37:55,320 --> 00:37:56,970 gaat afwijken van Next. 611 00:37:56,970 --> 00:37:57,930 Dus stap zal ons hier te brengen. 612 00:37:57,930 --> 00:38:02,100 Stap, stap, stap, stap, stap, stap, en We zullen gewoon oneindige lus altijd. 613 00:38:02,100 --> 00:38:06,810 >> Dus je zou kunnen wennen aan dat als je manier van identificeren oneindige loops, is 614 00:38:06,810 --> 00:38:08,960 alleen het houden van deze Enter om zien waar je vastloopt. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Er zijn betere manieren om dat te doen, maar voor nu, dat is volkomen voldoende. 617 00:38:14,780 --> 00:38:17,967 En stilistisch, om te voldoen aan Style 50, moet ik dit heb gedaan. 618 00:38:17,967 --> 00:38:21,550 619 00:38:21,550 --> 00:38:24,030 OK. 620 00:38:24,030 --> 00:38:28,400 >> Dus een laatste commando in te voeren. 621 00:38:28,400 --> 00:38:30,810 Nou, laten we gdb debug inch 622 00:38:30,810 --> 00:38:35,580 Dus in plaats van breken op hoofd, als ik weet de foo functie is ook de 623 00:38:35,580 --> 00:38:39,230 probleem is, dan zou ik gewoon zei, breken op foo, plaats. 624 00:38:39,230 --> 00:38:42,310 Laten we zeggen dat ik te breken op zowel het hoofd-foo. 625 00:38:42,310 --> 00:38:45,390 Dus je kunt zoveel breekpunten als je wilt. 626 00:38:45,390 --> 00:38:49,230 Wanneer ik run, het gaat te stoppen bij de - 627 00:38:49,230 --> 00:38:52,180 ooh, laten we opnieuw compileren, aangezien Ik dingen veranderd. 628 00:38:52,180 --> 00:38:55,950 Je zult deze lijn, Warning, bron zien bestand recenter is dan uitvoerbaar. 629 00:38:55,950 --> 00:38:59,680 Dus dat betekent dat ik ging gewoon hier en veranderde deze te voldoen aan Style 630 00:38:59,680 --> 00:39:03,100 50, maar ik heb niet opnieuw compileren het programma. 631 00:39:03,100 --> 00:39:04,870 Dus GDB maakt me van bewust. 632 00:39:04,870 --> 00:39:10,130 Ik zal stoppen, opnieuw te maken debug, hit gdb debug. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> Dus nu, terug naar wat ik aan het doen was. 635 00:39:12,800 --> 00:39:15,720 Breek belangrijkste, pauze foo. 636 00:39:15,720 --> 00:39:20,680 Nu als ik zonder het programma, dus het is zullen blijven totdat raakt een 637 00:39:20,680 --> 00:39:21,320 breekpunt. 638 00:39:21,320 --> 00:39:24,680 Dat breekpunt overkomt als eerste aan de Main. 639 00:39:24,680 --> 00:39:28,630 Nu, in plaats van het doen next, next, next, next, next, totdat ik raakte foo, ik 640 00:39:28,630 --> 00:39:35,230 typen kunnen blijven, die zal blijven tot je het volgende breekpunt. 641 00:39:35,230 --> 00:39:37,200 Ik moet het eerst een integer te voeren. 642 00:39:37,200 --> 00:39:40,570 Ga verder zal blijven totdat ik raakte de volgende breekpunt, namelijk dat 643 00:39:40,570 --> 00:39:43,320 functie van foo. 644 00:39:43,320 --> 00:39:50,130 >> Dus Run zal lopen tot je een breekpunt, maar je alleen type termijn bij 645 00:39:50,130 --> 00:39:54,060 je begint het programma, en dan, vanaf dat moment, het is voort te zetten. 646 00:39:54,060 --> 00:40:01,950 Als ik net deed breken hoofd-en Vervolgens liep, zal het op te breken 647 00:40:01,950 --> 00:40:03,670 belangrijkste, en ga dan verder. 648 00:40:03,670 --> 00:40:10,050 Aangezien ik heb geen breekpunt bij foo, voer de integer, dan nu ben ik 649 00:40:10,050 --> 00:40:11,380 niet gaat breken op foo. 650 00:40:11,380 --> 00:40:16,318 Het zal alleen maar tot oneindig lus tot dat. 651 00:40:16,318 --> 00:40:17,568 OK. 652 00:40:17,568 --> 00:40:19,500 653 00:40:19,500 --> 00:40:24,420 >> Dus dat is Inleiding tot GDB. 654 00:40:24,420 --> 00:40:27,790 Je moet beginnen met het in uw probleem sets. 655 00:40:27,790 --> 00:40:30,550 Het kan zeer nuttig zijn om bugs te identificeren. 656 00:40:30,550 --> 00:40:35,280 Als je eigenlijk alleen maar, regel voor regel, go door je code, en vergelijk wat is 657 00:40:35,280 --> 00:40:39,740 eigenlijk gebeurt met wat je verwacht te gebeuren, dan is het vrij 658 00:40:39,740 --> 00:40:41,060 moeilijk om je fouten te missen. 659 00:40:41,060 --> 00:40:45,280 660 00:40:45,280 --> 00:40:46,530 OK. 661 00:40:46,530 --> 00:40:48,310 662 00:40:48,310 --> 00:40:54,040 >> Dus vorige week David bracht dit secret-key cryptografie spullen voor de 663 00:40:54,040 --> 00:40:59,350 eerste keer, waar we niet willen wachtwoorden gewoon worden opgeslagen op onze 664 00:40:59,350 --> 00:41:03,210 computer in sommige tekstbestand, waar iemand kan over en kom gewoon 665 00:41:03,210 --> 00:41:04,660 open het en lees ze. 666 00:41:04,660 --> 00:41:07,530 Idealiter zouden ze gecodeerd op een bepaalde manier. 667 00:41:07,530 --> 00:41:13,340 En in Probleem Set 2, zult u te maken met een coderingsmethode, 668 00:41:13,340 --> 00:41:16,520 of, nou ja, twee methoden, maar ze zijn niet zo groot. 669 00:41:16,520 --> 00:41:20,050 Als je dat doet de hacker editie, je bent Ook zal te maken hebben met 670 00:41:20,050 --> 00:41:22,150 decoderen van sommige dingen. 671 00:41:22,150 --> 00:41:29,770 >> Dus de vraag is nu, goed, zelfs als wij hebben de sterkste encryptie 672 00:41:29,770 --> 00:41:34,830 algoritme in de wereld, als u kiest voor een bijzonder slecht wachtwoord, dan is het 673 00:41:34,830 --> 00:41:37,720 zal je niet veel helpen, omdat mensen nog steeds in staat om het te achterhalen. 674 00:41:37,720 --> 00:41:41,530 Hoewel het zien van de gecodeerde string en het ziet eruit als een puinhoop van vuilnis 675 00:41:41,530 --> 00:41:44,760 dat betekent niets voor hen, als ze nog hoeft alleen maar een paar wachtwoorden proberen 676 00:41:44,760 --> 00:41:50,560 om het te achterhalen, dan moet je zijn niet erg veilig. 677 00:41:50,560 --> 00:41:55,890 Dus kijken naar een video, die een maakt dat punt. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [VIDEO AFSPELEN] 680 00:42:00,970 --> 00:42:02,100 >> -Helm, u Fiend. 681 00:42:02,100 --> 00:42:03,370 Wat gebeurt er? 682 00:42:03,370 --> 00:42:05,170 Wat doe je met mijn dochter? 683 00:42:05,170 --> 00:42:09,910 >> -Sta mij toe te introduceren de briljante jonge plastisch chirurg, dr. Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, de grootste neus werk man in het gehele 685 00:42:13,730 --> 00:42:16,080 heelal, en Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Uwe Hoogheid. 687 00:42:17,210 --> 00:42:18,070 >> -Nose job? 688 00:42:18,070 --> 00:42:18,670 Ik begrijp het niet. 689 00:42:18,670 --> 00:42:20,090 Ze heeft al een neuscorrectie. 690 00:42:20,090 --> 00:42:21,910 Het was een zoete zestien aanwezig. 691 00:42:21,910 --> 00:42:22,140 >> -Nee. 692 00:42:22,140 --> 00:42:23,690 Het is niet wat je denkt. 693 00:42:23,690 --> 00:42:25,420 Het is veel, veel erger. 694 00:42:25,420 --> 00:42:30,300 Als je niet geef me de combinatie aan het luchtscherm, Dr Schlotkin zal 695 00:42:30,300 --> 00:42:34,226 geef uw dochter terug haar oude neus. 696 00:42:34,226 --> 00:42:35,476 >> -Nee. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 Waar heb je dat vandaan? 699 00:42:40,516 --> 00:42:41,440 >> -Oke. 700 00:42:41,440 --> 00:42:42,180 Ik zal vertellen. 701 00:42:42,180 --> 00:42:43,381 Ik zal vertellen. 702 00:42:43,381 --> 00:42:44,263 Nee, papa. 703 00:42:44,263 --> 00:42:45,590 Nee, je moet niet. 704 00:42:45,590 --> 00:42:46,860 >> Je hebt gelijk, mijn beste. 705 00:42:46,860 --> 00:42:48,450 Ik mis je nieuwe neus. 706 00:42:48,450 --> 00:42:52,090 Maar ik zal hem niet vertellen de combinatie, wat er ook gebeurt. 707 00:42:52,090 --> 00:42:53,680 >> -Heel goed. 708 00:42:53,680 --> 00:42:55,685 Dr Schlotkin, doe je ergste. 709 00:42:55,685 --> 00:42:56,914 >> -Mijn plezier. 710 00:42:56,914 --> 00:43:00,690 >> [TOOLS WORDT GESCHERPT] 711 00:43:00,690 --> 00:43:01,910 >> -Nee. 712 00:43:01,910 --> 00:43:02,520 Wacht. 713 00:43:02,520 --> 00:43:03,836 Wacht. 714 00:43:03,836 --> 00:43:05,300 Ik zal vertellen. 715 00:43:05,300 --> 00:43:06,880 Ik zal vertellen. 716 00:43:06,880 --> 00:43:09,130 >> -Ik wist dat het zou werken. 717 00:43:09,130 --> 00:43:09,900 Oke. 718 00:43:09,900 --> 00:43:12,850 Geef het aan mij. 719 00:43:12,850 --> 00:43:16,918 >> -De combinatie is een. 720 00:43:16,918 --> 00:43:17,406 >> -One. 721 00:43:17,406 --> 00:43:18,382 >> -One. 722 00:43:18,382 --> 00:43:19,358 >> -Twee. 723 00:43:19,358 --> 00:43:19,846 >> -Twee. 724 00:43:19,846 --> 00:43:20,822 >> -Twee. 725 00:43:20,822 --> 00:43:21,310 >> -Drie. 726 00:43:21,310 --> 00:43:21,798 >> -Drie. 727 00:43:21,798 --> 00:43:22,774 >> -Drie. 728 00:43:22,774 --> 00:43:23,262 >> -Vier. 729 00:43:23,262 --> 00:43:23,750 >> -Vier. 730 00:43:23,750 --> 00:43:26,150 >> -Vier. 731 00:43:26,150 --> 00:43:27,010 >> -Vijf. 732 00:43:27,010 --> 00:43:27,670 >> -Vijf. 733 00:43:27,670 --> 00:43:29,010 >> -Vijf. 734 00:43:29,010 --> 00:43:34,770 >> -Dus de combinatie is een, twee, drie, vier, vijf. 735 00:43:34,770 --> 00:43:37,460 Dat is het stomste combinatie Ik ooit in mijn leven gehoord. 736 00:43:37,460 --> 00:43:39,710 Dat is het soort ding een idioot zou hebben op zijn bagage. 737 00:43:39,710 --> 00:43:42,000 >> -Dank u, uw Hoogheid. 738 00:43:42,000 --> 00:43:43,530 >> -Wat heb je gedaan? 739 00:43:43,530 --> 00:43:44,490 >> -Ik zette de muur. 740 00:43:44,490 --> 00:43:45,420 >> -Nee dat heb je niet. 741 00:43:45,420 --> 00:43:45,840 Je zette de hele film. 742 00:43:45,840 --> 00:43:46,930 >> -Ik moet de verkeerde knop heeft ingedrukt. 743 00:43:46,930 --> 00:43:48,265 >> -Nou, zet hem weer aan. 744 00:43:48,265 --> 00:43:49,110 Zet de film weer op. 745 00:43:49,110 --> 00:43:49,510 >> -Ja, meneer. 746 00:43:49,510 --> 00:43:49,917 Ja, meneer. 747 00:43:49,917 --> 00:43:50,324 >> -Laten we gaan, Arnold. 748 00:43:50,324 --> 00:43:51,140 Kom, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Natuurlijk, je weet dat ik je nog steeds moet u een factuur voor. 750 00:43:53,060 --> 00:43:53,440 >> [END VIDEO AFSPELEN] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: Oke. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Dus nu dat we al hebben het over veiligheid in sommige opzichten, mooie 754 00:44:08,430 --> 00:44:16,050 weinig filmposter, dus in de afgelopen dagen, deze onderwerpen met de NSA 755 00:44:16,050 --> 00:44:17,300 alles te monitoren. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Het kan moeilijk zijn om het gevoel dat je hebben een soort van de persoonlijke levenssfeer in de 758 00:44:26,930 --> 00:44:34,540 online wereld, maar ik kon niet vertellen je de meeste van de gegevens van PRISM. 759 00:44:34,540 --> 00:44:42,130 Dus die verder gaat dan PRISM, we gaan niet te praten over dat, nu 760 00:44:42,130 --> 00:44:44,030 denk aan uw laptop. 761 00:44:44,030 --> 00:44:48,360 Dus hier, ik wil overschakelen mijn echte rekening, 762 00:44:48,360 --> 00:44:50,370 met mijn kleine pinguïn. 763 00:44:50,370 --> 00:44:57,310 Dus ik heb een wachtwoord ingesteld, en dat wachtwoord is wat ik wil dat het is. 764 00:44:57,310 --> 00:45:02,430 >> Maar vergeet niet dat wat ik in te loggen in met, dus dit login 765 00:45:02,430 --> 00:45:04,850 prompt, is een programma. 766 00:45:04,850 --> 00:45:07,910 Het is een programma dat was geschreven door een persoon. 767 00:45:07,910 --> 00:45:13,250 En ja, die persoon, als ze bijzonder kwaadaardig, ze konden 768 00:45:13,250 --> 00:45:17,780 hebben gezegd, oke, dus als het wachtwoord dat ik binnenkom is gelijk aan mijn 769 00:45:17,780 --> 00:45:22,800 werkelijke wachtwoord, of het gelijk een aantal speciale wachtwoord - 770 00:45:22,800 --> 00:45:25,550 David is geweldig of iets - 771 00:45:25,550 --> 00:45:27,190 laat ze dan binnen 772 00:45:27,190 --> 00:45:33,760 Dus een kwaadwillende programmeur zou kunnen hebben toegang tot al je Macs, of 773 00:45:33,760 --> 00:45:36,150 Windows, of wat dan ook. 774 00:45:36,150 --> 00:45:41,980 >> Dus dat is niet veel van een zorg, omdat, Ik bedoel, dit is login programma 775 00:45:41,980 --> 00:45:48,720 dat is geleverd met OS X, honderden of duizenden mensen 776 00:45:48,720 --> 00:45:50,020 beoordeeld deze code. 777 00:45:50,020 --> 00:45:55,330 En dus, als, in je code ergens, je zeggen als deze string gelijk gelijken 778 00:45:55,330 --> 00:45:58,860 David is geweldig, inloggen, dan iemand is gaat worden, zoals, wacht. 779 00:45:58,860 --> 00:45:59,800 Dit klopt niet. 780 00:45:59,800 --> 00:46:01,790 Dit moet hier niet zijn. 781 00:46:01,790 --> 00:46:06,650 Dus dat is een manier krijgen we dingen van de soort veilig te zijn. 782 00:46:06,650 --> 00:46:10,300 >> Maar denk eens zelfs programma die je schrijft. 783 00:46:10,300 --> 00:46:13,000 Laten we zeggen dat je het programma login schreef. 784 00:46:13,000 --> 00:46:20,440 Dus deze login programma dat je hebt geschreven, zo duidelijk, je bent een goede 785 00:46:20,440 --> 00:46:21,210 programmeur. 786 00:46:21,210 --> 00:46:25,610 Je gaat niet een kwaadaardige zetten als x gelijk gelijk David is geweldig 787 00:46:25,610 --> 00:46:27,860 in je code. 788 00:46:27,860 --> 00:46:31,930 Maar dit programma, wat je doet gebruiken om dit programma te compileren? 789 00:46:31,930 --> 00:46:34,180 Zoiets als Clang. 790 00:46:34,180 --> 00:46:38,460 Dus wat als de persoon die naar gebeurd schrijf Clang speciale gevat in Clang 791 00:46:38,460 --> 00:46:44,310 zoiets, als ik het samenstellen van de inloggen programma, voer dan deze code 792 00:46:44,310 --> 00:46:49,720 in het login programma dat zegt, als x gelijk is gelijk aan David is awesome? 793 00:46:49,720 --> 00:46:59,890 Dus nog niet helemaal, maar we hebben dezelfde geven hier, waar Clang, goed, 794 00:46:59,890 --> 00:47:03,790 duizenden of zelfs tienduizenden mensen, hebben gekeken naar Clang, hebben 795 00:47:03,790 --> 00:47:07,160 keek naar haar regels code en zei: oke, er is niets slecht hier. 796 00:47:07,160 --> 00:47:10,680 Uiteraard is niemand doet alles wat deze kwaadaardige. 797 00:47:10,680 --> 00:47:15,780 >> Maar wat is zelf Clang, zoals, wat als ik compileren Clang? 798 00:47:15,780 --> 00:47:20,900 Wat als ik een aantal compiler die compileert Clang dat voegt in Clang 799 00:47:20,900 --> 00:47:25,610 deze speciale hack die zegt, oke, toen ik compileren Clang, dan is de 800 00:47:25,610 --> 00:47:31,290 uitvoerbare Ik krijg moeten speciaal kijken binnenkant van het programma login en insert 801 00:47:31,290 --> 00:47:34,230 Dit wachtwoord is gelijk aan gelijken Dave is geweldig? 802 00:47:34,230 --> 00:47:37,990 Dus vergeet niet dat je compiler zelf moet op een gegeven moment worden opgesteld. 803 00:47:37,990 --> 00:47:42,810 Dus als wat je kiest om Clang compileren met, zelf kwaadaardig is, dan heb je 804 00:47:42,810 --> 00:47:45,580 kan worden geschroefd heel weg langs de lijn. 805 00:47:45,580 --> 00:47:49,630 >> Dus hier hebben we Ken Thompson en Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 Dus dit is een iconische foto. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie is aan de rechterkant. 808 00:47:55,470 --> 00:47:58,740 Hij is een belangrijke - 809 00:47:58,740 --> 00:48:03,640 vrij veel schreef C. Zo kunt u danken hem voor deze klasse. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson is aan de linkerkant. 811 00:48:04,840 --> 00:48:07,780 De twee van hen in principe schreef UNIX. 812 00:48:07,780 --> 00:48:10,140 Nou, ze waren een belangrijke bijdrage leverden in UNIX. 813 00:48:10,140 --> 00:48:11,310 Er waren enkele anderen. 814 00:48:11,310 --> 00:48:16,240 Dus Ken Thompson, op een bepaald punt, hij wint de Turing Award. 815 00:48:16,240 --> 00:48:20,860 En de Turing award, ik heb altijd gehoord zij verwezen op deze manier, het is de 816 00:48:20,860 --> 00:48:23,100 Nobelprijs van de informatica. 817 00:48:23,100 --> 00:48:27,500 >> Dus op de Turing Award, hij moet geven zijn dankwoord. 818 00:48:27,500 --> 00:48:31,790 En hij geeft deze zeer beroemde toespraak nu, genaamd Reflections on Vertrouwen 819 00:48:31,790 --> 00:48:35,620 Trust, die we hebben gekoppeld Om op de cursus website. 820 00:48:35,620 --> 00:48:41,670 En in deze toespraak, zegt hij, oke, dus schreef ik UNIX, en nu al 821 00:48:41,670 --> 00:48:43,320 je mensen gebruiken UNIX. 822 00:48:43,320 --> 00:48:46,960 Nu, bedenk vandaag dat Linux een directe afstammeling van UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X rechtstreeks gebruik maakt van UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows doet niet zo veel, maar veel ideeën werden genomen van UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Dus hij gaat tot het podium en zegt: oke, schreef ik UNIX. 826 00:48:59,220 --> 00:49:03,940 En zodat jullie weten, ben ik kunnen zich aanmelden bij elke 827 00:49:03,940 --> 00:49:05,590 enkel een van uw computers. 828 00:49:05,590 --> 00:49:14,280 Aangezien ik een van deze speciale als x gelijk gelijk Ken Thomson is geweldig, 829 00:49:14,280 --> 00:49:16,350 dan ben ik in mag loggen. 830 00:49:16,350 --> 00:49:18,370 Dus mensen zijn als, nou ja, Hoe doe je dat? 831 00:49:18,370 --> 00:49:21,090 We keken naar het programma login en niets is er. 832 00:49:21,090 --> 00:49:24,700 Hij is net als, nou ja, ik wijzigde de compiler om in te loggen in het programma login 833 00:49:24,700 --> 00:49:30,490 zodat het programma login nu zal hebben dat x gelijk gelijk Ken Thompson 834 00:49:30,490 --> 00:49:31,700 is geweldig. 835 00:49:31,700 --> 00:49:33,120 >> En zij zeggen: nou, dat is niet waar. 836 00:49:33,120 --> 00:49:35,740 We kijken naar de compiler en de compiler heeft geen regels hebben 837 00:49:35,740 --> 00:49:36,400 code als dat. 838 00:49:36,400 --> 00:49:40,540 Hij is net als, OK, maar wat zijn je het opstellen van de compiler met? 839 00:49:40,540 --> 00:49:44,810 En ze denken, en hij is, als, nou ja, Ik ben degene die u de compiler gaf 840 00:49:44,810 --> 00:49:50,580 u gebruikt om de compiler te compileren, zodat u het samenstellen van een compiler, die 841 00:49:50,580 --> 00:49:56,390 zelf is kwaadaardig, en zal breek het programma login. 842 00:49:56,390 --> 00:49:59,360 Dus eigenlijk, op dat punt, is er geen manier waarop je zou kunnen kijken naar de bron 843 00:49:59,360 --> 00:50:02,450 code van het programma login om te zien wat er mis is. 844 00:50:02,450 --> 00:50:04,220 Je kon niet eens in de broncode van de compiler 845 00:50:04,220 --> 00:50:06,790 om te zien wat er mis is. 846 00:50:06,790 --> 00:50:11,940 >> Je zou moeten kijken naar de machine code, de feitelijke binaire van de 847 00:50:11,940 --> 00:50:16,760 samengesteld compiler te zien, wacht, deze regels code zou hier niet moeten. 848 00:50:16,760 --> 00:50:22,130 Maar Ken Thompson nam het een stap verder en zei, nou ja, er zijn 849 00:50:22,130 --> 00:50:25,980 deze speciale programma's die eigenlijk helpen het binaire programma's te lezen, 850 00:50:25,980 --> 00:50:29,340 en dus als iemand gebruikt dat programma lees de binaire, zouden ze deze zien 851 00:50:29,340 --> 00:50:30,490 regels code. 852 00:50:30,490 --> 00:50:34,020 Hij bewerkt deze programma's om te zeggen, alle klopt, als je kijkt naar de 853 00:50:34,020 --> 00:50:38,460 compiler, niet dit specifieke tonen set van binaire. 854 00:50:38,460 --> 00:50:42,830 >> Dus dan moet je nemen dat een stap verder en eigenlijk, dat kan zijn 855 00:50:42,830 --> 00:50:46,210 die meerdere niveaus van indirectie en op een gegeven moment, niemand is eigenlijk 856 00:50:46,210 --> 00:50:47,990 gaat het controleren. 857 00:50:47,990 --> 00:50:52,590 Dus de moraal van het verhaal is, je bent niet van plan om te schrijven 858 00:50:52,590 --> 00:50:54,340 Clang in deze klasse. 859 00:50:54,340 --> 00:50:57,020 Je gaat gebruiken klimmen Clang veel in deze klasse. 860 00:50:57,020 --> 00:51:00,490 Voor alles wat je weet, Clang is een kwaadaardige programma dat saboteert elke 861 00:51:00,490 --> 00:51:03,520 enkel programma die je ooit hebt gecompileerd. 862 00:51:03,520 --> 00:51:08,206 En om u te verlaten op die zeer onheilspellende mee, zie je op woensdag. 863 00:51:08,206 --> 00:51:10,030 >> [Applaus] 864 00:51:10,030 --> 00:51:12,935 >> SPEAKER 2: Bij de volgende CS50. 865 00:51:12,935 --> 00:51:14,580 >> SPEAKER 3: Waag het niet zeggen. 866 00:51:14,580 --> 00:51:15,930 U kunt dit doen. 867 00:51:15,930 --> 00:51:19,440 Je hebt dit al eerder gedaan, kunt u dit doen vandaag de dag, kunt u dit doen morgen. 868 00:51:19,440 --> 00:51:20,930 Je hebt dit al jaren doen. 869 00:51:20,930 --> 00:51:22,790 Ga gewoon daar en doen dit. 870 00:51:22,790 --> 00:51:24,310 U kunt dit doen. 871 00:51:24,310 --> 00:51:26,102 >> [Muziek]