1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [MUSIK SPELA] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: Okej. 4 00:00:12,100 --> 00:00:15,620 Så, först sak först, i video från ett bekant ansikte. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [VIDEO SPELA] 7 00:00:22,560 --> 00:00:23,370 >> -Okej. 8 00:00:23,370 --> 00:00:27,150 Detta är CS50, och detta är början av vecka tre. 9 00:00:27,150 --> 00:00:29,980 Jag är ledsen att jag inte kunde vara där med dig idag, men låt mig presentera 10 00:00:29,980 --> 00:00:32,880 CS50 egen Rob Boden. 11 00:00:32,880 --> 00:00:33,872 >> [END VIDEOAVSPELNING] 12 00:00:33,872 --> 00:00:39,340 >> [Applåder och jubel] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: Det filmografi in att video är fantastiskt. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Okej. 16 00:00:47,770 --> 00:00:50,960 Så först, det finns en annan lunch. 17 00:00:50,960 --> 00:00:52,330 Det är i morgon klockan 01:15. 18 00:00:52,330 --> 00:00:54,480 Det finns ingen lunch på fredag. 19 00:00:54,480 --> 00:00:55,810 Det är med Quora. 20 00:00:55,810 --> 00:01:00,190 Och Tommy är inte här ännu, men en av människorna där är förre chefen CF, 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Så han är en rolig kille. 23 00:01:02,730 --> 00:01:04,819 Du borde komma. 24 00:01:04,819 --> 00:01:05,900 >> Okej. 25 00:01:05,900 --> 00:01:11,360 Så förra veckan började vi bryta isär om vad en sträng egentligen är. 26 00:01:11,360 --> 00:01:14,830 Vi har känt sedan början som det är en sekvens av tecken. 27 00:01:14,830 --> 00:01:18,130 Men förra veckan, grävde vi i det faktum att det som verkligen är en sekvens av 28 00:01:18,130 --> 00:01:22,110 tecken, ja, nu har vi arrayer av tecken. 29 00:01:22,110 --> 00:01:26,450 Och vi vet att en sträng, det är en array tecken, i slutet, 30 00:01:26,450 --> 00:01:30,920 Vi har denna speciella null-byte, detta snedstreck 0 indikerar att änden av 31 00:01:30,920 --> 00:01:32,230 strängen. 32 00:01:32,230 --> 00:01:36,970 >> Och så en sträng är en matris med tecken, men vi kan ha mer än 33 00:01:36,970 --> 00:01:39,530 bara en uppsättning av tecken, Vi kan ha en matris av någon 34 00:01:39,530 --> 00:01:40,890 typ av sak som vi vill ha. 35 00:01:40,890 --> 00:01:51,570 Så, om du minns från förra veckan, den Ages program som David introducerade 36 00:01:51,570 --> 00:01:53,560 riktigt snabbt. 37 00:01:53,560 --> 00:01:57,010 Så första vi ska göra är fråga användaren om ett heltal, det 38 00:01:57,010 --> 00:01:58,800 Antalet personer i rummet. 39 00:01:58,800 --> 00:02:01,260 När vi har det heltal, vi deklarera en array. 40 00:02:01,260 --> 00:02:02,890 Lägg märke till detta stativ syntax. 41 00:02:02,890 --> 00:02:04,540 Du kommer att vänja sig vid det. 42 00:02:04,540 --> 00:02:09,430 >> Så vi deklarera en array av heltal heter åldrar, och det finns n 43 00:02:09,430 --> 00:02:12,080 heltal i denna samling. 44 00:02:12,080 --> 00:02:16,480 Så detta mönster just här, detta 4 int i är lika med 0, i är mindre än n, i plus 45 00:02:16,480 --> 00:02:20,580 plus, det kommer också att bli ett mönster att du får väldigt van vid. 46 00:02:20,580 --> 00:02:24,000 Eftersom det är ganska mycket hur du är alltid att iterera över arrayer. 47 00:02:24,000 --> 00:02:26,330 Så kom ihåg att n är längden på vår array. 48 00:02:26,330 --> 00:02:32,120 Och så här är vi flera gånger frågar för åldern på personen jag i rummet. 49 00:02:32,120 --> 00:02:36,640 >> Efter detta går vi ner, och av någon godtycklig anledning, vi sedan 50 00:02:36,640 --> 00:02:40,220 skriva ut hur gamla de ska att vara ett år från nu. 51 00:02:40,220 --> 00:02:49,980 Och kör det programmet, låt oss göra åldrar, dot slash åldrar. 52 00:02:49,980 --> 00:02:53,010 Så många människor i rummet, låt oss säga att det finns tre. 53 00:02:53,010 --> 00:02:59,880 Och säga, den första personen är 13, Nästa är 26, och den sista är 30. 54 00:02:59,880 --> 00:03:05,080 Så då det kommer att iterera över dessa tre folk, skriva ut 14, 27, och 31. 55 00:03:05,080 --> 00:03:16,060 >> Så kom ihåg att när vi deklarerar en matris av storlek n, indexen i det 56 00:03:16,060 --> 00:03:19,950 array, har arrayen värden och index 0, 1, 2, hela vägen 57 00:03:19,950 --> 00:03:21,680 upp till n minus 1. 58 00:03:21,680 --> 00:03:26,255 Så när vi sa att det fanns tre personer i rummet, och vi sätter in här 59 00:03:26,255 --> 00:03:29,850 den första iterationen genom denna slinga, är jag kommer att vara 0. 60 00:03:29,850 --> 00:03:31,650 Så i index 0. 61 00:03:31,650 --> 00:03:34,540 Vi tilldelar den första åldras användaren anger. 62 00:03:34,540 --> 00:03:38,870 Sedan i nästa, vi kommer in i andra n användaren anger, och i 63 00:03:38,870 --> 00:03:40,580 bredvid två, den sista n. 64 00:03:40,580 --> 00:03:44,200 >> Så märker att en matris med storlek tre inte har något 65 00:03:44,200 --> 00:03:46,040 i indexet tre. 66 00:03:46,040 --> 00:03:49,036 Det är inte giltigt. 67 00:03:49,036 --> 00:03:50,250 Okej. 68 00:03:50,250 --> 00:03:55,136 Så, gå tillbaka hit. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Så nu när vi har behandlat arrayer, vi har viss erfarenhet. 71 00:04:01,590 --> 00:04:03,780 Nu ska vi gå vidare till kommando för det, som kommer att vara 72 00:04:03,780 --> 00:04:05,890 ganska relevant till detta problem set. 73 00:04:05,890 --> 00:04:09,670 >> Så fram till nu, när du har deklarerat din huvudsakliga funktion, vi har 74 00:04:09,670 --> 00:04:11,230 sade int main tomrum. 75 00:04:11,230 --> 00:04:14,070 Så void betyder bara att Vi är inte passerar någon 76 00:04:14,070 --> 00:04:16,440 argument till denna funktion. 77 00:04:16,440 --> 00:04:19,190 Nu ska vi se att huvud kan ta några argument. 78 00:04:19,190 --> 00:04:22,470 Här kallar vi dem int argc och sträng argv parentes. 79 00:04:22,470 --> 00:04:26,930 Konsolerna återigen, vilket indikerar att vi har att göra med matriser. 80 00:04:26,930 --> 00:04:31,850 Så här, sträng argv parentes, vi är att göra med en array med strängar. 81 00:04:31,850 --> 00:04:35,360 Så argc, det kommer att indikera hur många argument som vi har 82 00:04:35,360 --> 00:04:37,580 gått till detta program. 83 00:04:37,580 --> 00:04:46,050 Och för att se vad det betyder, låt oss avsluta det här. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Så fram till nu har vi kör varje program som dot slash åldrar. 86 00:04:50,790 --> 00:04:55,250 Vi kan också, på kommandoraden, tidigare skicka argument, därav termen, kommandot 87 00:04:55,250 --> 00:04:56,550 line argument. 88 00:04:56,550 --> 00:04:59,760 Så det första argumentet, hallå världen. 89 00:04:59,760 --> 00:05:03,350 Så här skulle argc vara tre. 90 00:05:03,350 --> 00:05:07,720 Det är räkningen av argumenten på kommandoraden. 91 00:05:07,720 --> 00:05:12,840 Argc är alltid minst en, sedan dot slash åldrar, i sig, räknas som en av 92 00:05:12,840 --> 00:05:14,490 kommandoradsargumenten. 93 00:05:14,490 --> 00:05:17,010 >> Då hej är den första. 94 00:05:17,010 --> 00:05:20,460 Om dot slash åldrar är den nollte, då hej är det första, och världen är det 95 00:05:20,460 --> 00:05:22,830 andra kommandorad argument. 96 00:05:22,830 --> 00:05:29,490 Så strängen argv, vi kommer att se, innehåller strängar, punkt snedstreck 97 00:05:29,490 --> 00:05:33,830 åldrar, hej, och världen. 98 00:05:33,830 --> 00:05:38,945 Och, av David begäran, vi ska för att spela upp en video att införa det. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [VIDEO SPELA] 101 00:05:43,890 --> 00:05:46,240 >> -Hittills i program vi har skrivet, har vi förklarar 102 00:05:46,240 --> 00:05:48,500 huvud som int main tomrum. 103 00:05:48,500 --> 00:05:51,170 Och hela den här tiden har det tomrum helt enkelt varit anger att 104 00:05:51,170 --> 00:05:54,430 Programmet tar inte någon kommandoradsargument. 105 00:05:54,430 --> 00:05:57,750 Med andra ord, när en användare kör en program, kan han eller hon ge kommandot 106 00:05:57,750 --> 00:06:01,710 line argument genom att skriva ytterligare ord eller fraser efter programmets 107 00:06:01,710 --> 00:06:03,000 namnet vid prompten. 108 00:06:03,000 --> 00:06:06,550 >> Tja, om du vill du att ditt program till ta kommandoradsargument, en eller 109 00:06:06,550 --> 00:06:10,540 fler sådana ord, måste vi byta ut annullera med ett par argument. 110 00:06:10,540 --> 00:06:12,200 Så låt oss göra det. 111 00:06:12,200 --> 00:06:15,750 Inkludera CS50.h. 112 00:06:15,750 --> 00:06:19,360 Inkludera standard io.h. 113 00:06:19,360 --> 00:06:20,760 Int main. 114 00:06:20,760 --> 00:06:26,330 Och nu, i stället för tomrum, jag ska ange en int heter argc, och en 115 00:06:26,330 --> 00:06:28,780 array med strängar som kallas argv. 116 00:06:28,780 --> 00:06:31,820 Nu argc och argv är helt enkelt konventioner. 117 00:06:31,820 --> 00:06:34,000 >> Vi kunde ha kallat dessa argument mest vad vi vill. 118 00:06:34,000 --> 00:06:37,630 Men vad som är viktigt är att argc är en int eftersom, per definition, är det 119 00:06:37,630 --> 00:06:41,360 kommer att innehålla argumentet räkningen, den antalet ord i totalt att 120 00:06:41,360 --> 00:06:43,380 användare har skrivit på sin prompt. 121 00:06:43,380 --> 00:06:47,910 argv, under tiden, argument vektor, är kommer att faktiskt vara en array lagrar 122 00:06:47,910 --> 00:06:52,020 alla dessa ord som användaren har skrivit på sin prompt. 123 00:06:52,020 --> 00:06:54,500 >> Låt oss fortsätta att göra något nu med en eller flera av dessa 124 00:06:54,500 --> 00:06:55,660 kommandoradsargument. 125 00:06:55,660 --> 00:07:00,070 Framför allt, låt oss gå vidare och skriva ut oavsett ord som användaren skriver 126 00:07:00,070 --> 00:07:03,960 efter programmets namn vid prompten. 127 00:07:03,960 --> 00:07:04,730 Öppna konsol. 128 00:07:04,730 --> 00:07:06,240 Stäng fästet. 129 00:07:06,240 --> 00:07:10,510 Printf procent s backslash och kommatecken. 130 00:07:10,510 --> 00:07:14,550 Och nu måste jag berätta printf vilket värde att plugga in det platshållaren. 131 00:07:14,550 --> 00:07:18,600 Jag vill att det första ordet som användaren har skrev efter programmets namn, 132 00:07:18,600 --> 00:07:23,130 och så jag kommer att ange argv fäste 1, nära 133 00:07:23,130 --> 00:07:24,830 parentes, semikolon. 134 00:07:24,830 --> 00:07:27,290 >> Nu, varför fäste 1 och inte konsol 0? 135 00:07:27,290 --> 00:07:30,990 Jo, det visar sig, lagras automatiskt i argv 0 kommer att bli det 136 00:07:30,990 --> 00:07:32,620 programmets verkliga namn. 137 00:07:32,620 --> 00:07:36,180 Så det första ordet som användaren skriver efter programmets namn är, genom 138 00:07:36,180 --> 00:07:38,990 konvention, kommer att bli lagras i argv 1. 139 00:07:38,990 --> 00:07:42,380 Låt oss nu sammanställa och köra programmet. 140 00:07:42,380 --> 00:07:47,780 >> Gör argv 0, pricka snedstreck argv 0. 141 00:07:47,780 --> 00:07:50,520 Och nu ett ord som hej. 142 00:07:50,520 --> 00:07:51,670 Enter. 143 00:07:51,670 --> 00:07:53,520 Och där har vi det, hej. 144 00:07:53,520 --> 00:07:55,750 >> [END VIDEOAVSPELNING] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: Okej. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Stäng det. 148 00:08:01,230 --> 00:08:16,730 Så ta en titt på det program som vi bara presenterades för oss, ja, precis 149 00:08:16,730 --> 00:08:24,710 att visa, om vi skriver ut argv 0, göra, nu vad är det, argv 0, dot slash argv 0. 150 00:08:24,710 --> 00:08:30,440 Så, som väntat, är det att skriva ut namnet på programmet, eftersom argv 0 är 151 00:08:30,440 --> 00:08:32,970 alltid kommer att vara den namnet på programmet. 152 00:08:32,970 --> 00:08:35,640 Men låt oss göra något lite mer intressant. 153 00:08:35,640 --> 00:08:42,080 >> Så i problemet set, kommer du att introduceras till denna funktion, atoi. 154 00:08:42,080 --> 00:08:44,440 Så vad gör vi använder atoi för? 155 00:08:44,440 --> 00:08:48,550 Det kommer att konvertera en sträng till ett heltal. 156 00:08:48,550 --> 00:08:53,280 Så om jag passerar strängen, ett två tre, till atoi, kommer att omvandla den 157 00:08:53,280 --> 00:08:56,910 till heltal, ett två tre. 158 00:08:56,910 --> 00:09:01,480 Så vi kommer att konvertera den första kommandoradsargumentet till ett heltal, 159 00:09:01,480 --> 00:09:05,690 och sedan bara skriva ut det heltal. 160 00:09:05,690 --> 00:09:09,680 >> Så i grund och botten, vi är typ av reimplementing getInt, bara 161 00:09:09,680 --> 00:09:12,350 heltal matas in på kommando linje istället för i programmet 162 00:09:12,350 --> 00:09:14,560 interaktivt. 163 00:09:14,560 --> 00:09:23,170 Så då gör argv 0, låt oss göra det här, och stäng det. 164 00:09:23,170 --> 00:09:27,670 Så kör argv 0, och låt oss gå in i heltal, en två tre fyr en två. 165 00:09:27,670 --> 00:09:30,840 Så det kommer att skriva ut heltal, en två tre fyr en två. 166 00:09:30,840 --> 00:09:35,500 Det finns vissa nyanser att atoi att det ska sluta bry sig om vad som helst 167 00:09:35,500 --> 00:09:39,040 utöver ett giltigt numeriskt tecken, men det spelar ingen roll. 168 00:09:39,040 --> 00:09:42,870 >> Så vad tror du händer om jag gör det? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Segmente fel. 171 00:09:47,050 --> 00:09:50,410 Så varför är det? 172 00:09:50,410 --> 00:09:56,060 Om du ser tillbaka på vårt program, vi är konvertering argv ett, det första argumentet 173 00:09:56,060 --> 00:09:59,610 efter programnamnet, till ett heltal. 174 00:09:59,610 --> 00:10:03,350 Men det är inget argument passerade efter programnamnet. 175 00:10:03,350 --> 00:10:08,060 Så här ser vi att det är en buggy programmet, eftersom, om vi försöker köra den 176 00:10:08,060 --> 00:10:10,530 utan några argument, det kommer bara krascha. 177 00:10:10,530 --> 00:10:16,950 >> Så en annan gemensamt mönster ser du är något liknande, om argc är mindre 178 00:10:16,950 --> 00:10:21,100 än två, vilket indikerar att det inte var åtminstone programmets namn och en 179 00:10:21,100 --> 00:10:29,100 första argumentet, då vi ska göra något som printf, inte tillräckligt 180 00:10:29,100 --> 00:10:31,190 kommandoradsargument. 181 00:10:31,190 --> 00:10:33,170 Det är nog inte bra att skriva ut, det är nog något, som 182 00:10:33,170 --> 00:10:35,440 du ska skriva in ett heltal på kommandoraden. 183 00:10:35,440 --> 00:10:37,450 Jag ska bara avsluta det där. 184 00:10:37,450 --> 00:10:39,600 Och sedan tillbaka 1. 185 00:10:39,600 --> 00:10:44,740 Så kom ihåg att i slutet av vår program, om vi återvänder 0, den sortens 186 00:10:44,740 --> 00:10:47,060 indikerar framgång. 187 00:10:47,060 --> 00:10:50,940 Och huvud också automatiskt returnerar 0 om du inte gör. 188 00:10:50,940 --> 00:10:55,800 >> Så här ska vi återinställning 1 för att indikera att det inte lyckas. 189 00:10:55,800 --> 00:11:01,000 Och du kan gå tillbaka vad du vill, precis, 0 indikerar framgång, och 190 00:11:01,000 --> 00:11:03,390 något annat indikerar misslyckande. 191 00:11:03,390 --> 00:11:04,855 Så låt oss köra denna version av saker. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Så nu, om vi inte anger en kommandorad argument, kommer det på rätt sätt berätta 194 00:11:16,600 --> 00:11:18,290 oss, inte tillräckligt kommandorad. 195 00:11:18,290 --> 00:11:20,610 Visste inte avsluta meningen. 196 00:11:20,610 --> 00:11:24,950 Annars, om vi faktiskt ge det en, det kan avsluta programmet. 197 00:11:24,950 --> 00:11:27,920 Så detta är hur du skulle använda argc i För att validera det antal 198 00:11:27,920 --> 00:11:30,630 kommandoradsargument som godo. 199 00:11:30,630 --> 00:11:39,360 >> Så låt oss göra det här programmet lite mer komplicerat, och titta på den andra 200 00:11:39,360 --> 00:11:42,180 iteration av saker. 201 00:11:42,180 --> 00:11:46,310 Så nu, vi är inte bara skriva ut första kommandoraden argument. 202 00:11:46,310 --> 00:11:51,210 Här, vi iterera från int i jämlikar 0, är ​​jag mindre än argc, jag plus 203 00:11:51,210 --> 00:11:55,280 plus, och tryckning argv, index i. 204 00:11:55,280 --> 00:11:59,300 Så detta mönster, återigen, är det samma mönster som tidigare, utom i stället 205 00:11:59,300 --> 00:12:02,600 att ringa variabeln n, vi använder argc. 206 00:12:02,600 --> 00:12:09,520 >> Så det här är att iterera över varje index i arrayen, och skriver ut varje 207 00:12:09,520 --> 00:12:11,910 elementet i matrisen. 208 00:12:11,910 --> 00:12:20,300 Och så, när vi kör det här programmet, ja, Jag har inte fyllt i någon kommandorad 209 00:12:20,300 --> 00:12:22,540 argument, så det bara utskrifter programnamnet. 210 00:12:22,540 --> 00:12:26,053 Om jag anger en massa saker, det ska skriva ut en, var och en på egen rad. 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 Så låt oss ta detta ett steg längre. 214 00:12:34,770 --> 00:12:38,890 Och istället för att skriva ut varje argument på en egen rad, låt oss skriva ut varje 215 00:12:38,890 --> 00:12:42,590 karaktär varje argument på en egen rad. 216 00:12:42,590 --> 00:12:46,700 Så kom ihåg att argv är en array av strängar. 217 00:12:46,700 --> 00:12:50,960 Så vad är en sträng, men en samling av tecken? 218 00:12:50,960 --> 00:12:57,140 Så det betyder att argv är verkligen en matris av en matris av tecken. 219 00:12:57,140 --> 00:13:04,920 Så att dra nytta av det, Låt oss bortse från detta för nu. 220 00:13:04,920 --> 00:13:08,190 Låt oss bara betrakta strängen argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Så om vi vill ta varje tecken i argv 0 på en egen rad, då jag vill ha 222 00:13:14,170 --> 00:13:19,500 att göra det mönster som vi är vana vid, är jag mindre än längden av arrayen, 223 00:13:19,500 --> 00:13:23,990 som här, är strlen av, det är inte vad jag vill göra, sträng 224 00:13:23,990 --> 00:13:26,450 n är lika med argv 0. 225 00:13:26,450 --> 00:13:30,390 Så i är mindre än längden av vår matris, som i detta fall är en matris 226 00:13:30,390 --> 00:13:34,410 tecken, jag plus plus. 227 00:13:34,410 --> 00:13:41,040 Och så, som vi såg i förra veckan, är den idealisk Om vi ​​går att strlen utanför 228 00:13:41,040 --> 00:13:45,210 av tillståndet, kommer sedan n att lägga den strlen av s varje gång vi går 229 00:13:45,210 --> 00:13:47,720 genom öglan, och det är inte kommer att förändras. 230 00:13:47,720 --> 00:13:50,230 Så vi ska sätta den lika med n hit. 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 Så nu, vi iterera över varje index i arrayen. 234 00:14:01,320 --> 00:14:05,630 Och så, om vi vill skriva ut varje karaktär i den arrayen, procent c är 235 00:14:05,630 --> 00:14:06,880 flagg vi vill använda för tecken. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 Och nu en konsol jag kommer att bli det sträng, indextecken i, så om det 238 00:14:19,770 --> 00:14:20,970 sträng var hej. 239 00:14:20,970 --> 00:14:27,530 då är 0 kommer att vara h, s fäste 1 kommer att vara e, och så vidare. 240 00:14:27,530 --> 00:14:30,800 >> Så nu vill vi kombinera dessa två saker. 241 00:14:30,800 --> 00:14:35,440 Vi vill skriva ut varje tecken av varje kommandorad argument. 242 00:14:35,440 --> 00:14:38,950 Så vi kommer att ha en kapslad för slinga. 243 00:14:38,950 --> 00:14:47,480 Och som konventionellt, den första räknaren är jag, nästa kommer att vara j, n 244 00:14:47,480 --> 00:14:54,450 kommer att vara den strlen av argv i, i är mindre än n, i plus plus. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 Och nu i stället för utskrift argv i, så argv fäste jag kommer att index - 247 00:15:06,870 --> 00:15:14,280 som kommer att vara den i: te kommandorad argument, argv i, j kommer att 248 00:15:14,280 --> 00:15:16,925 vara den j: e tecknet i det i: te argumentet. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Jag ska bli av med detta här uppe nu eftersom vi sätta den i den slingan. 251 00:15:24,810 --> 00:15:33,900 Så motsvarar sträng s jämlikar argv i, och sedan s fäste j.. 252 00:15:33,900 --> 00:15:36,980 >> Tja, vi behöver inte deklarera denna variabel s. 253 00:15:36,980 --> 00:15:44,530 Istället kommer vi bara kombinera dessa två i vad vi hade, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> HÖGTALARE 1: [OHÖRBAR]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: Bra samtal. 257 00:15:49,680 --> 00:15:52,936 Så det här är bruten. 258 00:15:52,936 --> 00:15:55,510 Om jag faktiskt körde det, vi skulle ha insett detta. 259 00:15:55,510 --> 00:16:01,210 Så disken jag bryr mig om i detta specifika för 260 00:16:01,210 --> 00:16:05,410 loop är j, iterator. 261 00:16:05,410 --> 00:16:08,560 Så du skulle ha stött på problem, förmodligen en oändlig slinga, om vi 262 00:16:08,560 --> 00:16:09,540 hade inte fast det. 263 00:16:09,540 --> 00:16:12,220 Det är därför vi också pratar om felsökning i dag. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Så låt oss köra programmet. 266 00:16:15,240 --> 00:16:21,200 Och låt oss faktiskt lägga en separat printf just här som bara kommer ut 267 00:16:21,200 --> 00:16:27,480 en annan linje, eftersom det innebär när vi kör programmet, kommer det att finnas en tom 268 00:16:27,480 --> 00:16:31,830 linje mellan varje tecken i varje kommandorad argument. 269 00:16:31,830 --> 00:16:33,448 Nåväl, vi får se vad det betyder. 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 Fick lite bugg. 273 00:16:39,870 --> 00:16:42,860 Fel implicit förklara biblioteksfunktion strlen. 274 00:16:42,860 --> 00:16:51,630 >> Så gå tillbaka in i vårt program, jag glömde att hash inkluderar string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 Så string.h kommer att bli det header-fil som förklarar 277 00:16:57,730 --> 00:16:58,980 funktionen strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, sammanställer det. 280 00:17:06,060 --> 00:17:09,109 Nu ska vi köra det. 281 00:17:09,109 --> 00:17:10,930 Så bara det. 282 00:17:10,930 --> 00:17:17,790 Det kommer att skriva ut våra programnamn, hallå världen. 283 00:17:17,790 --> 00:17:23,510 Det kommer att skrivas ut varje sak, varje karaktär, på en egen rad. 284 00:17:23,510 --> 00:17:24,540 OK. 285 00:17:24,540 --> 00:17:30,625 >> Så låt oss verkligen ta detta ett steg längre. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 Och istället för att använda string.h, låt oss tänka på hur vi skulle genomföra vår egen 288 00:17:39,700 --> 00:17:41,420 strlen funktion. 289 00:17:41,420 --> 00:17:45,600 Så jag ska genast ge en funktion signatur. 290 00:17:45,600 --> 00:17:52,900 Så låt oss kalla i my_strlen, och det är kommer att ta en sträng som argument, 291 00:17:52,900 --> 00:17:57,220 och vi räknar med att återlämna längden på den strängen. 292 00:17:57,220 --> 00:18:03,430 Så, var är han? 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 Så kom ihåg från den tidigare bilden som var också från förra veckan, att en 296 00:18:12,900 --> 00:18:18,890 samling av tecken, ja, en sträng, så låt oss säga att det är vår sträng s.. 297 00:18:18,890 --> 00:18:29,870 Så om s är strängen, hej då, H-E-L-L-O, i minnet, det kommer att 298 00:18:29,870 --> 00:18:35,610 vara, och då detta snedstreck 0 tecken. 299 00:18:35,610 --> 00:18:39,170 >> Så hur får vi längden på s? 300 00:18:39,170 --> 00:18:43,190 Tja, är tricket söker här motreaktion 0 karaktär, denna null 301 00:18:43,190 --> 00:18:44,380 terminator. 302 00:18:44,380 --> 00:18:50,270 Så algoritmen kommer vara något som få 303 00:18:50,270 --> 00:18:51,510 tillräckligt många tecken som - 304 00:18:51,510 --> 00:18:56,180 låt oss ha denna hand utgör några disk, låt oss kalla det här int längd. 305 00:18:56,180 --> 00:19:00,060 Så, från över här, vi är kommer att iterera över vår sträng. 306 00:19:00,060 --> 00:19:04,100 >> Så det första tecknet, det är H, och det är inte back slash 0, så 307 00:19:04,100 --> 00:19:05,170 längden är 1. 308 00:19:05,170 --> 00:19:08,050 Iterera till nästa tecken, E, och det är inte backslash 0. 309 00:19:08,050 --> 00:19:09,630 Längd 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 Och slutligen, når vi omvänt snedstreck 0, och så det betyder, ja, 314 00:19:16,690 --> 00:19:17,780 denna sträng är avslutad. 315 00:19:17,780 --> 00:19:20,130 Så låt oss gå tillbaka 5. 316 00:19:20,130 --> 00:19:33,630 >> Så faktiskt genomföra det, först, mitt n längd är lika med 0, min högra hand. 317 00:19:33,630 --> 00:19:36,088 Och vi kommer att iterera - 318 00:19:36,088 --> 00:19:38,000 >> HÖGTALARE 1: [OHÖRBAR] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Åh, skjuta. 320 00:19:38,640 --> 00:19:39,870 Bra samtal. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Så n längd är lika med 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Så nu, inte när s längd lika och då, snedstreck 0. 325 00:19:58,310 --> 00:20:04,660 Så kom ihåg, detta backslash 0, är ​​det en faktiska karaktär, och det visar 326 00:20:04,660 --> 00:20:05,820 slutet av strängen. 327 00:20:05,820 --> 00:20:09,850 Precis som, också, omvänt snedstreck n är en faktisk karaktär. 328 00:20:09,850 --> 00:20:14,040 Omvänt snedstreck 0 kommer att indikera i slutet av vår sträng. 329 00:20:14,040 --> 00:20:15,414 Jag vill inte säga det där. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 Och medan s indexeras av längd inte lika med nollterminatom, då 332 00:20:25,620 --> 00:20:27,130 Vi kommer bara att öka längden. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Så då, i slutet av vårt program, längd så småningom kommer att 335 00:20:34,880 --> 00:20:37,610 vara 5 i detta fall. 336 00:20:37,610 --> 00:20:39,210 Och vi ska bara tillbaka längd. 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 Så nu här nere, det gör jag inte do my_strlen. 340 00:20:48,290 --> 00:20:50,700 Låt oss sammanställa den för att se allt flyter smidigt. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Var jag gör i 2? 343 00:20:58,210 --> 00:21:00,565 Eller var det 1? 344 00:21:00,565 --> 00:21:01,940 Det borde göra. 345 00:21:01,940 --> 00:21:02,690 Okej. 346 00:21:02,690 --> 00:21:08,490 Så det här är argv 2. 347 00:21:08,490 --> 00:21:11,585 Fungerar som förväntat, även om var att jag gjorde det i? 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 Denna version av saker som inte hade printf ny rad efter, men det 352 00:21:21,820 --> 00:21:22,910 gör ingen skillnad. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 Så fungerade som förväntat. 355 00:21:25,780 --> 00:21:34,750 >> Nu kan vi även kombinera detta ett steg vidare, där meddelande här, ja, 356 00:21:34,750 --> 00:21:38,920 första, vi ta tag i strlen av argv i, och sedan vi iterera över 357 00:21:38,920 --> 00:21:41,450 varje tecken på den strängen. 358 00:21:41,450 --> 00:21:47,480 Så istället för att göra det, tänk om vi bara kombinera denna logik för att vänta 359 00:21:47,480 --> 00:21:50,740 tills vi träffade backslash 0 rätt in i detta för loop? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Så iterera medan argv i, j gör icke lika snedstreck 0. 362 00:22:07,490 --> 00:22:10,680 Så låt oss köra den första. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Okej. 365 00:22:21,180 --> 00:22:27,655 Så här, är detta villkor som säger - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 låt oss klara det. 368 00:22:40,060 --> 00:22:49,140 Så nu, låt det vara vår argv. 369 00:22:49,140 --> 00:22:55,290 Så när jag körde just det programmet innan, argv är en array av strängar. 370 00:22:55,290 --> 00:23:03,100 Och så, om jag kör det med punkt snedstreck argv 2, hallå världen, då den argv 371 00:23:03,100 --> 00:23:07,650 själv är längd 3, för argv noll, hej, och världen. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> Och inne i var och en av dessa index är, själv en matris, där det kommer att bli 374 00:23:19,660 --> 00:23:23,780 prick, kommer detta att vara snedstreck, jag vet inte om det var rätt riktning, jag 375 00:23:23,780 --> 00:23:25,680 tror inte att det var. 376 00:23:25,680 --> 00:23:30,110 A-R-V-streck, behöver mer utrymme. 377 00:23:30,110 --> 00:23:32,570 Låt oss klippa in i denna samling. 378 00:23:32,570 --> 00:23:38,230 A-R-V streck 0 och sedan omvänt snedstreck 0. 379 00:23:38,230 --> 00:23:43,160 Och sedan i oordning blir hej. 380 00:23:43,160 --> 00:23:45,910 Låt oss säga, H-E backslash 0. 381 00:23:45,910 --> 00:23:51,130 Och slutligen, W-O snedstreck 0. 382 00:23:51,130 --> 00:23:59,730 >> Så den algoritm som vi skrev precis, den kapslade för loopar, vad de är 383 00:23:59,730 --> 00:24:07,321 gör är, vi först ha motverka i och sedan j.. 384 00:24:07,321 --> 00:24:15,206 Det skulle vara lättare med kod på skärm, Låt oss gå tillbaka till detta. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 Så märker att jag är den iterator som är iterera över varje kommando 387 00:24:24,600 --> 00:24:25,610 line argument. 388 00:24:25,610 --> 00:24:28,870 Och J är den iterator iteration över varje tecken i det 389 00:24:28,870 --> 00:24:30,410 kommandoradsargumentet. 390 00:24:30,410 --> 00:24:46,755 Så vad detta innersta printf gör är har vi printf argv 0 0, 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, men nu, argv 0 7 kommer att 392 00:24:58,680 --> 00:25:00,670 lika omvänt snedstreck 0. 393 00:25:00,670 --> 00:25:05,730 >> Så då vi lämnar det för loop, och nu jag itererar till 1. 394 00:25:05,730 --> 00:25:10,910 Och nu ska vi skriva ut argv 1 0, argv 1 1 - 395 00:25:10,910 --> 00:25:17,040 bra, nu, sedan jag klippa hej kort, argv 1 2 återigen kommer att bli 396 00:25:17,040 --> 00:25:18,170 snedstreck 0. 397 00:25:18,170 --> 00:25:25,050 Och så, öka i och fortsätta, och så vidare, tills vi skriva ut alla 398 00:25:25,050 --> 00:25:28,580 världen, och de är tre kommandorad argument, och vi kommer att gå ut ur 399 00:25:28,580 --> 00:25:31,670 den yttersta slinga, och avsluta vårt program. 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 >> Så låt oss komma tillbaka hit. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Så du kommer att få en viss förtrogenhet med kommandoradsargument på detta 406 00:25:52,370 --> 00:25:54,460 särskilt problem inställd. 407 00:25:54,460 --> 00:25:56,630 >> Nu, felsökning. 408 00:25:56,630 --> 00:26:01,680 Så du förmodligen redan har haft att göra lite felsökning med dina tidigare 409 00:26:01,680 --> 00:26:03,120 problem set. 410 00:26:03,120 --> 00:26:08,420 Och ett mycket enkelt sätt för felsökning, första, låt oss titta på en buggy program. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Tja, gå genom det här programmet, vi kommer att fråga användaren om ett 413 00:26:23,830 --> 00:26:29,350 heltal, ta det heltal, och sedan, godtyckligt, har vi en while-slinga som 414 00:26:29,350 --> 00:26:32,280 är bara att stega jag tills det är lika med 10. 415 00:26:32,280 --> 00:26:35,820 Låt oss bara anta att jag kommer in ett heltal större än 10. 416 00:26:35,820 --> 00:26:38,700 Så dekrementera jag tills det är lika med 10. 417 00:26:38,700 --> 00:26:42,630 >> Och då har vi ytterligare en tid loop att, medan jag inte är lika med 0, vi är 418 00:26:42,630 --> 00:26:44,540 kommer att minska värdet i med 3. 419 00:26:44,540 --> 00:26:49,790 Så om du ser avsikten med bugg här, det är så det kommer att minska värdet i att 420 00:26:49,790 --> 00:26:57,010 vara 10, och sedan detta samtidigt loop kommer minskning i från 10 till 7, till 4, till 1, 421 00:26:57,010 --> 00:27:02,880 till negativ 2, till den negativa 5, och så vidare, till negativ oändlighet, eftersom jag kommer 422 00:27:02,880 --> 00:27:05,920 aldrig lika 0. 423 00:27:05,920 --> 00:27:08,610 Och sedan i slutet av det här programmet, vi har foo funktion som är 424 00:27:08,610 --> 00:27:12,130 pågår utskrift som jag. 425 00:27:12,130 --> 00:27:16,520 >> Så det här är en kort och trivial program, och felet är uppenbart, 426 00:27:16,520 --> 00:27:18,790 särskilt efter att jag bara sa vad felet var. 427 00:27:18,790 --> 00:27:24,840 Men avsikten här är, ja, kanske det faktiskt ser ut som en del av din 428 00:27:24,840 --> 00:27:30,040 lösningar från girig från den sista problembild, och kanske du har 429 00:27:30,040 --> 00:27:32,800 någon oändlig loop i ditt program, och du har ingen aning 430 00:27:32,800 --> 00:27:34,100 vad som orsakar det. 431 00:27:34,100 --> 00:27:38,690 Så en mycket användbar felsökning teknik är att bara lägga printfs 432 00:27:38,690 --> 00:27:40,180 hela din kod. 433 00:27:40,180 --> 00:27:49,200 >> Så här vill jag ha en printf utanför första while-slinga. 434 00:27:49,200 --> 00:27:53,155 Och här vill jag ha en printf, och jag ska bara skriva ut i.. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Jag ska även göra först while-slinga, jag. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 Utanför, andra while-slinga. 439 00:28:09,040 --> 00:28:12,170 Än en gång, skriva ut inuti härifrån, det värde jag. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 Och låt oss köra. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> Så dot slash debug. 444 00:28:24,800 --> 00:28:25,610 Ange ett heltal. 445 00:28:25,610 --> 00:28:28,150 Låt oss göra 13. 446 00:28:28,150 --> 00:28:28,760 Och bom. 447 00:28:28,760 --> 00:28:33,300 Vi ser att vi är oändliga slingor insidan av det andra medan loopen. 448 00:28:33,300 --> 00:28:36,305 Så nu vet vi vad felet är. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Men printf debugging är helt fantastisk, men när dina program får 451 00:28:45,610 --> 00:28:50,560 längre och mer komplicerat, det finns mer sofistikerade lösningar på 452 00:28:50,560 --> 00:28:51,705 få saker att fungera. 453 00:28:51,705 --> 00:28:52,955 Så låt oss ta bort alla dessa printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 Och låt oss se till att jag inte gjorde det bryta någonting. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Så det program vi ska att införa kallas 458 00:29:14,180 --> 00:29:16,715 GDB, för GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Jo, faktiskt, låt oss ta bort debug för en andra, och göra debug igen. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Jo, faktiskt först, en bra lektion i kommandoradsargument. 463 00:29:34,440 --> 00:29:37,780 Lägg märke till att denna Clang kommando som är sammanställa allt förs vidare 464 00:29:37,780 --> 00:29:41,300 på kommandoraden, dessa kommandoradsargument. 465 00:29:41,300 --> 00:29:46,250 Så exakt hur du ska använda kommandoradsargument, som vi 466 00:29:46,250 --> 00:29:51,500 gjorde tidigare, och som du kommer i PSET 2, det är hur Clang använder dem. 467 00:29:51,500 --> 00:30:00,070 >> Så märker att denna första flagga, streck ggdb3, vad det säger är, klang, 468 00:30:00,070 --> 00:30:03,790 du bör sammanställa denna fil med uppsåt att vi så småningom kommer 469 00:30:03,790 --> 00:30:05,380 behöver felsöka det. 470 00:30:05,380 --> 00:30:13,840 Så länge du har den flagga, då kan vi GDB debug. 471 00:30:13,840 --> 00:30:17,380 Och det kommer att öppna upp GNU Debugger. 472 00:30:17,380 --> 00:30:22,920 >> Så det finns en hel del kommandon att du måste vänja sig. 473 00:30:22,920 --> 00:30:27,100 Först en som du kommer förmodligen omedelbart behöver är Kör. 474 00:30:27,100 --> 00:30:28,200 Så vad som Kör göra? 475 00:30:28,200 --> 00:30:30,910 Det kommer att starta vårt program. 476 00:30:30,910 --> 00:30:36,180 Så kör, starta program, programmet ber oss för ett heltal, 13. 477 00:30:36,180 --> 00:30:39,170 Och då är det oändligt looping som väntat, förutom att jag tog bort 478 00:30:39,170 --> 00:30:40,500 printfs, så att vi inte ens ser det. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Exited normalt. 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 Det är möjligt att det lindade alla tvärtom, tillbaka till - ignorera det. 484 00:30:53,640 --> 00:30:55,170 Antar att det inte avsluta normalt. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Det är ett komplicerat svar på det. 487 00:31:03,370 --> 00:31:07,890 >> Så nu, det är inte mycket användbart. 488 00:31:07,890 --> 00:31:11,480 Så bara köra vårt program inuti detta debugger hjälper inte oss på något 489 00:31:11,480 --> 00:31:15,610 sätt, eftersom vi kunde ha bara gjort dot slash debug utanför GDB. 490 00:31:15,610 --> 00:31:21,250 Så den ett kommando att du kommer antagligen - 491 00:31:21,250 --> 00:31:22,970 och jag ska avsluta det här. 492 00:31:22,970 --> 00:31:25,850 Kontroll-d eller sluta, både arbete. 493 00:31:25,850 --> 00:31:29,550 Så låt oss öppna den igen. 494 00:31:29,550 --> 00:31:31,130 >> Ett annat kommando som du kommer antagligen omedelbart vill 495 00:31:31,130 --> 00:31:33,600 vänja sig är Break. 496 00:31:33,600 --> 00:31:37,120 Så vi ska bryta på huvud för nu, och sedan ska jag förklara det. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Tja, här ser vi att vi satt en brytpunkt på denna linje i debug.c. 499 00:31:46,370 --> 00:31:50,160 Så vad rast betyder är att när jag typ springa, programmet kommer att 500 00:31:50,160 --> 00:31:53,560 fortsätter att gå tills Jag träffade en brytpunkt. 501 00:31:53,560 --> 00:31:59,390 Så när jag slog loppet startar programmet, och då det bryts så snart som den 502 00:31:59,390 --> 00:32:01,940 går huvudfunktionen. 503 00:32:01,940 --> 00:32:06,930 Break kommer att bli något du ganska vanligt att göra. 504 00:32:06,930 --> 00:32:11,340 >> Och nu, för att presentera dig till några fler kommandon. 505 00:32:11,340 --> 00:32:14,330 Observera här, att det säger vi bröt vid linjen 11, vilket är 506 00:32:14,330 --> 00:32:16,230 printf anger ett heltal. 507 00:32:16,230 --> 00:32:21,260 Så kommandot Nästa kommer att bli hur vi går till nästa kodrad. 508 00:32:21,260 --> 00:32:24,810 Det här kommer att ge oss möjlighet att gå genom vårt program rad för rad. 509 00:32:24,810 --> 00:32:26,260 Så nästa. 510 00:32:26,260 --> 00:32:29,820 >> Nu linje 12, kommer vi för att få heltal. 511 00:32:29,820 --> 00:32:30,450 Nästa. 512 00:32:30,450 --> 00:32:34,290 Och om du bara trycka Enter igen, kommer det göra om det sista du gjorde. 513 00:32:34,290 --> 00:32:36,480 Så jag behöver inte skriva Nästa varje gång. 514 00:32:36,480 --> 00:32:40,100 Så skriv in ett heltal, 13. 515 00:32:40,100 --> 00:32:46,940 Så nu, när jag är linje 14, större än 10, och jag ska göra härnäst. 516 00:32:46,940 --> 00:32:48,685 Och vi ser att vi kommer att minska värdet i.. 517 00:32:48,685 --> 00:32:50,210 Så vi kommer att minska värdet i igen. 518 00:32:50,210 --> 00:32:53,620 >> Så nu, en annan användbar kommandot Skriv ut. 519 00:32:53,620 --> 00:32:55,750 Så ut kommer att skriva ut värdet på variabeln. 520 00:32:55,750 --> 00:32:57,825 Låt oss ta fram det värde av variabeln i. 521 00:32:57,825 --> 00:32:58,705 Låt oss skriva ut i.. 522 00:32:58,705 --> 00:33:00,910 Det kommer att säga att jag är 11. 523 00:33:00,910 --> 00:33:03,330 Nu har vi nästa gång när i är större än 10. 524 00:33:03,330 --> 00:33:05,590 Så jag är fortfarande större än 10, eftersom det är 11. 525 00:33:05,590 --> 00:33:06,920 i. minus minus. 526 00:33:06,920 --> 00:33:08,250 Låt oss skriva ut i igen. 527 00:33:08,250 --> 00:33:10,950 Som förväntat, är det 10. 528 00:33:10,950 --> 00:33:12,510 >> Så nu, nästa. 529 00:33:12,510 --> 00:33:16,250 Det kommer tillbaka till det tillstånd, är jag större än 10, men i är nu 10, så 530 00:33:16,250 --> 00:33:20,040 det är inte större än 10, så vi förväntar det att falla ut ur while-slinga. 531 00:33:20,040 --> 00:33:22,220 Och nu är vi under den kodrad. 532 00:33:22,220 --> 00:33:28,750 Och ett annat kommando, List, är bara att gå för att visa föregående och nästa 533 00:33:28,750 --> 00:33:31,240 några rader kod, i Om du förlorat dig själv. 534 00:33:31,240 --> 00:33:35,420 Så vi just lämnat denna while-slinga, och nu har vi angett detta 535 00:33:35,420 --> 00:33:37,080 while-slinga, linje 18. 536 00:33:37,080 --> 00:33:39,860 Så medan jag inte är lika med 0. 537 00:33:39,860 --> 00:33:46,570 Och, nästa, jag är lika i minus 3, och vi kommer märker, kommer detta bara fortsätta. 538 00:33:46,570 --> 00:33:48,270 Och vi kan trycka i.. 539 00:33:48,270 --> 00:33:49,990 >> Varje kommando slags har genvägar. 540 00:33:49,990 --> 00:33:51,720 Så p står för Print. 541 00:33:51,720 --> 00:33:53,400 Så vi kan pi. 542 00:33:53,400 --> 00:33:57,550 Bara hålla hålla n, eller fortsätta göra nästa. 543 00:33:57,550 --> 00:33:58,340 Skriv i igen. 544 00:33:58,340 --> 00:34:00,380 Du ser nu är det negativ 167. 545 00:34:00,380 --> 00:34:06,030 Så det här kommer att fortsätta för evigt, men inte verkligen för evigt, eftersom du just såg, det 546 00:34:06,030 --> 00:34:09,330 faktiskt kommer att sluta någon gång. 547 00:34:09,330 --> 00:34:15,699 >> Så det börjar GDB. 548 00:34:15,699 --> 00:34:19,504 Men låt oss göra en sak i GDB. 549 00:34:19,504 --> 00:34:20,754 Uh, felsöka. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Så, i detta fall den oändlig loop råkade vara inne i 552 00:34:28,534 --> 00:34:30,050 den viktigaste funktionen. 553 00:34:30,050 --> 00:34:35,779 Och för nu, bara acceptera det som jag är kommer att flytta oändlig slinga in 554 00:34:35,779 --> 00:34:37,029 foo funktion. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Kom bara ihåg att det vid slutet av denna program, ja, det var ursprungligen 557 00:34:43,730 --> 00:34:46,210 ringer foo, vilket var precis tryckningen i.. 558 00:34:46,210 --> 00:34:51,880 Men nu är vi kallar foo, vilket är går att stega jag tills det är 0, och 559 00:34:51,880 --> 00:34:54,548 sedan skriva ut den variabeln. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Spara det. 562 00:34:57,970 --> 00:35:00,175 Gör debug. 563 00:35:00,175 --> 00:35:03,310 Och nu, gdb debug. 564 00:35:03,310 --> 00:35:04,090 OK. 565 00:35:04,090 --> 00:35:10,580 >> Så om jag bara köra då jag inte kommer att kunna faktiskt gå igenom min 566 00:35:10,580 --> 00:35:11,730 Programmet linje-för-linje. 567 00:35:11,730 --> 00:35:19,820 Så låt oss bryta på huvud, och skriv sedan kör. 568 00:35:19,820 --> 00:35:28,160 Så gå igenom detta, printf, anger ett heltal, få heltal, 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Så vi kommer att hålla dekrementering tills jag är större än 10. 571 00:35:37,490 --> 00:35:42,840 Sen ska vi falla igenom while-slinga, och få till linjen - 572 00:35:42,840 --> 00:35:44,364 låt oss öppna den i ett separat fönster. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Så vi minskas tills jag inte längre större än 10, och då vi 575 00:35:53,300 --> 00:35:55,700 kallas funktionen foo. 576 00:35:55,700 --> 00:36:01,340 >> Så vad hände så fort jag slog funktionen foo, väl, ringde jag foo, och 577 00:36:01,340 --> 00:36:04,030 då jag inte längre hade kontroll över GDB. 578 00:36:04,030 --> 00:36:10,230 Så fort jag slog Nästa på denna linje, saker fortsatte tills detta hände, 579 00:36:10,230 --> 00:36:12,400 där programmet lämnat när - 580 00:36:12,400 --> 00:36:14,450 antar att det fanns inte så småningom. 581 00:36:14,450 --> 00:36:16,390 Du såg det paus för lite om. 582 00:36:16,390 --> 00:36:22,040 Så varför gjorde jag tappar kontrollen över programmet på den punkten? 583 00:36:22,040 --> 00:36:27,540 Jo, när jag skriver nästa, går det till den bokstav nästa kodrad som 584 00:36:27,540 --> 00:36:28,850 kommer att utföra. 585 00:36:28,850 --> 00:36:35,950 Så efter linje 21, nästa kodrad som kommer att utföra är linje 22, 586 00:36:35,950 --> 00:36:38,520 vilket är, ut från huvud. 587 00:36:38,520 --> 00:36:43,810 Så jag vill inte bara gå till nästa kodrad. 588 00:36:43,810 --> 00:36:48,170 Jag vill gå in i funktionen foo, och sedan också gå igenom 589 00:36:48,170 --> 00:36:49,830 dessa rader kod. 590 00:36:49,830 --> 00:36:53,726 >> Så för det, har vi ett alternativ. 591 00:36:53,726 --> 00:36:56,770 Låt oss avsluta det igen. 592 00:36:56,770 --> 00:36:58,020 Break. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, nästa, nästa, 13, nästa, nästa, nästa, försiktigt, 595 00:37:06,370 --> 00:37:09,820 innan vi slog linje foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> Så nu är vi på rad 21, där vi kallar foo. 598 00:37:13,700 --> 00:37:17,100 Vi vill inte skriva nästa, eftersom det kommer bara anropa funktionen foo, och 599 00:37:17,100 --> 00:37:18,710 gå till nästa kodrad. 600 00:37:18,710 --> 00:37:20,840 Vad vi vill använda är Step. 601 00:37:20,840 --> 00:37:25,690 Så det finns en skillnad mellan steg och nästa, där steg kliver in i 602 00:37:25,690 --> 00:37:28,190 fungera, och nästa går över funktionen. 603 00:37:28,190 --> 00:37:32,830 Det utför just helheten av funktion och håller igång. 604 00:37:32,830 --> 00:37:37,210 >> Så steg kommer att föra oss in i funktionen foo. 605 00:37:37,210 --> 00:37:41,160 Och vi ser här, nu är vi tillbaka på denna while-slinga som är, i teorin, 606 00:37:41,160 --> 00:37:44,190 kommer att fortsätta för evigt. 607 00:37:44,190 --> 00:37:50,420 Och om du träffar steg, när det inte ens en funktion för att ringa, då är det 608 00:37:50,420 --> 00:37:51,720 identisk med nästa. 609 00:37:51,720 --> 00:37:55,320 Så det är bara när du är på en linje som kallar en funktion som steg 610 00:37:55,320 --> 00:37:56,970 kommer att skilja sig från Next. 611 00:37:56,970 --> 00:37:57,930 Så steg kommer att föra oss hit. 612 00:37:57,930 --> 00:38:02,100 Steg, steg, steg, steg, steg, steg, och vi ska bara oändlig loop för alltid. 613 00:38:02,100 --> 00:38:06,810 >> Så du kan vänja sig vid det som din sätt att identifiera oändliga slingor, är 614 00:38:06,810 --> 00:38:08,960 bara hålla detta Enter för att se var du kör fast. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Det finns bättre sätt att göra det, men för nu är det fullt tillräckligt. 617 00:38:14,780 --> 00:38:17,967 Och stilistiskt, för att överensstämma med Style 50, jag borde ha gjort det. 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 >> Så en sista kommandot för att införa. 621 00:38:28,400 --> 00:38:30,810 Nåväl, låt oss gdb debug i. 622 00:38:30,810 --> 00:38:35,580 Så istället för att bryta vid huvud, om jag vet foo funktion är också den 623 00:38:35,580 --> 00:38:39,230 problem, så jag kunde bara sade, bryta på foo istället. 624 00:38:39,230 --> 00:38:42,310 Låt oss säga att jag bryter på både huvud och foo. 625 00:38:42,310 --> 00:38:45,390 Så du kan ställa in så många brytpunkter som du vill. 626 00:38:45,390 --> 00:38:49,230 När jag skriver springa, det kommer att stanna vid - 627 00:38:49,230 --> 00:38:52,180 ooh, låt oss kompilera, eftersom Jag ändrade saker. 628 00:38:52,180 --> 00:38:55,950 Du ser den här linjen, varning, källa filen är nyare än körbar. 629 00:38:55,950 --> 00:38:59,680 Så det betyder att jag gick bara in här och bytte dessa att överensstämma med Style 630 00:38:59,680 --> 00:39:03,100 50, men jag ville inte kompilera programmet. 631 00:39:03,100 --> 00:39:04,870 Så GDB gör mig medveten om det. 632 00:39:04,870 --> 00:39:10,130 Jag ska sluta, gör debug igen, slå gdb debug. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> Så nu, tillbaka till vad jag gjorde. 635 00:39:12,800 --> 00:39:15,720 Break, break foo. 636 00:39:15,720 --> 00:39:20,680 Nu om jag kör programmet, så det är kommer att fortsätta tills träffar en 637 00:39:20,680 --> 00:39:21,320 brytpunkt. 638 00:39:21,320 --> 00:39:24,680 Denna brytpunkt händer vara den första i main. 639 00:39:24,680 --> 00:39:28,630 Nu, istället för att göra nästa, nästa, nästa, nästa, nästa, tills jag slog foo, jag 640 00:39:28,630 --> 00:39:35,230 kan skriva fortsätta, vilket kommer att fortsätta tills du trycker på nästa brytpunkt. 641 00:39:35,230 --> 00:39:37,200 Jag måste komma in i heltal först. 642 00:39:37,200 --> 00:39:40,570 Fortsätt fortsätter tills jag träffade nästa brytpunkt, vilket är att 643 00:39:40,570 --> 00:39:43,320 funktion foo. 644 00:39:43,320 --> 00:39:50,130 >> Så kör kör tills du träffar en brytpunkten, men du bara skriver sikt när 645 00:39:50,130 --> 00:39:54,060 du startar programmet, och sedan, från och med då, det fortsätter. 646 00:39:54,060 --> 00:40:01,950 Om jag bara bryta huvud och sedan sprang, det ska gå sönder vid 647 00:40:01,950 --> 00:40:03,670 huvud, och sedan fortsätta. 648 00:40:03,670 --> 00:40:10,050 Eftersom jag inte har en brytpunkt vid foo, ange heltal, så nu är jag 649 00:40:10,050 --> 00:40:11,380 inte kommer att bryta på foo. 650 00:40:11,380 --> 00:40:16,318 Det är bara att gå till oändlig slinga tills det. 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 >> Så det är Introduktion till GDB. 654 00:40:24,420 --> 00:40:27,790 Du borde börja använda den i dina problemsamlingar. 655 00:40:27,790 --> 00:40:30,550 Det kan vara till stor hjälp att identifiera fel. 656 00:40:30,550 --> 00:40:35,280 Om du faktiskt bara, rad för rad, går genom din kod, och jämföra vad som är 657 00:40:35,280 --> 00:40:39,740 faktiskt händer med vad du förväntar dig att hända, då är det ganska 658 00:40:39,740 --> 00:40:41,060 svårt att missa dina buggar. 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 >> Så förra veckan David tog upp detta secret key kryptografi grejer för 663 00:40:54,040 --> 00:40:59,350 första gången, om vi inte vill lösenord bara lagras på vår 664 00:40:59,350 --> 00:41:03,210 dator i någon vanlig textfil, där någon som kan komma och bara 665 00:41:03,210 --> 00:41:04,660 öppna den och läsa dem. 666 00:41:04,660 --> 00:41:07,530 Helst skulle de vara krypterad på något sätt. 667 00:41:07,530 --> 00:41:13,340 Och i Problem Set 2, kommer du att ha att göra med ett förfarande för kryptering, 668 00:41:13,340 --> 00:41:16,520 eller, ja, två metoder, men de är inte så stor. 669 00:41:16,520 --> 00:41:20,050 Om du gör hacker upplagan, du också kommer att ha att göra med 670 00:41:20,050 --> 00:41:22,150 dekryptera vissa saker. 671 00:41:22,150 --> 00:41:29,770 >> Så frågan nu är, väl, även om vi har den starkaste krypteringen 672 00:41:29,770 --> 00:41:34,830 algoritmen i världen, om du väljer en särskilt dåliga lösenord, då det 673 00:41:34,830 --> 00:41:37,720 kommer inte att hjälpa så mycket, eftersom människor kommer fortfarande att kunna lista ut det. 674 00:41:37,720 --> 00:41:41,530 Även om se den krypterade strängen och det ser ut som en enda röra av skräp 675 00:41:41,530 --> 00:41:44,760 det betyder ingenting för dem, om de fortfarande bara måste prova några lösenord 676 00:41:44,760 --> 00:41:50,560 att lista ut det, då du inte är mycket säker. 677 00:41:50,560 --> 00:41:55,890 Så titta på en video som gör den punkten. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [VIDEO SPELA] 680 00:42:00,970 --> 00:42:02,100 >> -Hjälm, djävul dig. 681 00:42:02,100 --> 00:42:03,370 Vad är det som händer? 682 00:42:03,370 --> 00:42:05,170 Vad gör du med min dotter? 683 00:42:05,170 --> 00:42:09,910 >> -Tillåt mig att presentera den lysande ung plastikkirurg, Dr Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, störst näsa jobb man i hela 685 00:42:13,730 --> 00:42:16,080 universum, och Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Ers Höghet. 687 00:42:17,210 --> 00:42:18,070 >> -Näsa jobb? 688 00:42:18,070 --> 00:42:18,670 Jag förstår inte. 689 00:42:18,670 --> 00:42:20,090 Hon har redan haft en näsoperation. 690 00:42:20,090 --> 00:42:21,910 Det var en söt sexton närvarande. 691 00:42:21,910 --> 00:42:22,140 >> -Nej. 692 00:42:22,140 --> 00:42:23,690 Det är inte vad du tror. 693 00:42:23,690 --> 00:42:25,420 Det är mycket, mycket värre. 694 00:42:25,420 --> 00:42:30,300 Om du inte ger mig kombinationen till luftskydd, Dr Schlotkin kommer 695 00:42:30,300 --> 00:42:34,226 ge din dotter tillbaka sin gamla näsa. 696 00:42:34,226 --> 00:42:35,476 >> -Nej. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 Var har du fått det? 699 00:42:40,516 --> 00:42:41,440 >> -Okej. 700 00:42:41,440 --> 00:42:42,180 Jag ska berätta. 701 00:42:42,180 --> 00:42:43,381 Jag ska berätta. 702 00:42:43,381 --> 00:42:44,263 Nej, pappa. 703 00:42:44,263 --> 00:42:45,590 Nej, du måste inte. 704 00:42:45,590 --> 00:42:46,860 >> -Du har rätt, min kära. 705 00:42:46,860 --> 00:42:48,450 Jag kommer att sakna din nya näsa. 706 00:42:48,450 --> 00:42:52,090 Men jag kommer inte att berätta för honom kombinationen, oavsett vad. 707 00:42:52,090 --> 00:42:53,680 >> -Mycket bra. 708 00:42:53,680 --> 00:42:55,685 Dr Schlotkin, gör din värsta. 709 00:42:55,685 --> 00:42:56,914 >> -Ingen orsak. 710 00:42:56,914 --> 00:43:00,690 >> [VERKTYG skärps] 711 00:43:00,690 --> 00:43:01,910 >> -Nej. 712 00:43:01,910 --> 00:43:02,520 Vänta. 713 00:43:02,520 --> 00:43:03,836 Vänta. 714 00:43:03,836 --> 00:43:05,300 Jag ska berätta. 715 00:43:05,300 --> 00:43:06,880 Jag ska berätta. 716 00:43:06,880 --> 00:43:09,130 >> -Jag visste att det skulle fungera. 717 00:43:09,130 --> 00:43:09,900 Okej. 718 00:43:09,900 --> 00:43:12,850 Ge den till mig. 719 00:43:12,850 --> 00:43:16,918 >> -Kombinationen är en. 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 >> -Två. 723 00:43:19,358 --> 00:43:19,846 >> -Två. 724 00:43:19,846 --> 00:43:20,822 >> -Två. 725 00:43:20,822 --> 00:43:21,310 >> -Tre. 726 00:43:21,310 --> 00:43:21,798 >> -Tre. 727 00:43:21,798 --> 00:43:22,774 >> -Tre. 728 00:43:22,774 --> 00:43:23,262 >> -Fyra. 729 00:43:23,262 --> 00:43:23,750 >> -Fyra. 730 00:43:23,750 --> 00:43:26,150 >> -Fyra. 731 00:43:26,150 --> 00:43:27,010 >> -Fem. 732 00:43:27,010 --> 00:43:27,670 >> -Fem. 733 00:43:27,670 --> 00:43:29,010 >> -Fem. 734 00:43:29,010 --> 00:43:34,770 >> -So kombinationen är ett, två, tre, fyra, fem. 735 00:43:34,770 --> 00:43:37,460 Det är det dummaste kombinationen Jag någonsin hört i hela mitt liv. 736 00:43:37,460 --> 00:43:39,710 Det är sånt en idiot skulle ha på sitt bagage. 737 00:43:39,710 --> 00:43:42,000 >> -Tack, din höghet. 738 00:43:42,000 --> 00:43:43,530 >> -Vad gjorde du? 739 00:43:43,530 --> 00:43:44,490 >> -Jag stängde av muren. 740 00:43:44,490 --> 00:43:45,420 >> -Nej det gjorde du inte. 741 00:43:45,420 --> 00:43:45,840 Du stängde av hela filmen. 742 00:43:45,840 --> 00:43:46,930 >> -Jag måste ha tryckt på fel knapp. 743 00:43:46,930 --> 00:43:48,265 >> -Tja, lägger tillbaka den. 744 00:43:48,265 --> 00:43:49,110 Sätt på filmen igen. 745 00:43:49,110 --> 00:43:49,510 >> -Ja, sir. 746 00:43:49,510 --> 00:43:49,917 Ja, sir. 747 00:43:49,917 --> 00:43:50,324 >> -Kom igen, Arnold. 748 00:43:50,324 --> 00:43:51,140 Kom, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Naturligtvis vet du jag ska fortfarande måste fakturera dig för detta. 750 00:43:53,060 --> 00:43:53,440 >> [END VIDEOAVSPELNING] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: Okej. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Så nu när vi redan pratar om säkerhet på vissa sätt, trevlig 754 00:44:08,430 --> 00:44:16,050 liten filmaffisch, så på senare dagar, dessa frågor med NSA 755 00:44:16,050 --> 00:44:17,300 övervaka allting. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Det kan vara svårt att känna att du har någon form av privatlivet 758 00:44:26,930 --> 00:44:34,540 online-världen, även om jag inte kunde berätta du de flesta av detaljerna i PRISM. 759 00:44:34,540 --> 00:44:42,130 Så rör sig bortom PRISM, vi kommer inte att tala om det, nu 760 00:44:42,130 --> 00:44:44,030 tänka på din bärbara dator. 761 00:44:44,030 --> 00:44:48,360 Så här uppe, jag vill byta till mitt egentliga konto, 762 00:44:48,360 --> 00:44:50,370 med min lilla pingvin. 763 00:44:50,370 --> 00:44:57,310 Så jag har ett lösenord set, och att lösenord är vad jag vill att det ska vara. 764 00:44:57,310 --> 00:45:02,430 >> Men kom ihåg att det jag loggar in med, så denna inloggning 765 00:45:02,430 --> 00:45:04,850 snabb, är en del program. 766 00:45:04,850 --> 00:45:07,910 Det är några program som var skriven av någon person. 767 00:45:07,910 --> 00:45:13,250 Och så, den personen, om de är särskilt skadliga, de kunde 768 00:45:13,250 --> 00:45:17,780 har sagt, okej, så om lösenordet att jag kommer in är lika med min 769 00:45:17,780 --> 00:45:22,800 faktiska lösenord, eller det är lika till någon speciell lösenord - 770 00:45:22,800 --> 00:45:25,550 David är fantastisk eller något - 771 00:45:25,550 --> 00:45:27,190 låt dem i. 772 00:45:27,190 --> 00:45:33,760 Så en illvillig programmerare kan ha tillgång till alla dina Mac-datorer, eller 773 00:45:33,760 --> 00:45:36,150 Windows, eller vad som helst. 774 00:45:36,150 --> 00:45:41,980 >> Så det är inte mycket av en oro, eftersom, Jag menar, det här inloggningsprogram 775 00:45:41,980 --> 00:45:48,720 som är levereras med OS X, hundratals eller tusentals människor har 776 00:45:48,720 --> 00:45:50,020 granskat denna kod. 777 00:45:50,020 --> 00:45:55,330 Och så, om det i din kod någonstans, du säga om den här strängen är lika med jämlikar 778 00:45:55,330 --> 00:45:58,860 David är fantastisk, inloggning, då någons kommer att bli, typ, vänta. 779 00:45:58,860 --> 00:45:59,800 Det här är inte rätt. 780 00:45:59,800 --> 00:46:01,790 Detta borde inte vara här. 781 00:46:01,790 --> 00:46:06,650 Så det är ett sätt som vi får saker och ting att vara typ av säker. 782 00:46:06,650 --> 00:46:10,300 >> Men tänk om ens program att du skriver. 783 00:46:10,300 --> 00:46:13,000 Låt säga att du skrev inloggningsprogram. 784 00:46:13,000 --> 00:46:20,440 Så här inloggningsprogram som du skrev, så självklart, du är en bra 785 00:46:20,440 --> 00:46:21,210 programmerare. 786 00:46:21,210 --> 00:46:25,610 Du kommer inte att lägga någon skadlig om x är lika med lika David är fantastisk 787 00:46:25,610 --> 00:46:27,860 i koden. 788 00:46:27,860 --> 00:46:31,930 Men det här programmet, vad gör du använder för att sammanställa det här programmet? 789 00:46:31,930 --> 00:46:34,180 Något liknande klang. 790 00:46:34,180 --> 00:46:38,460 Så vad händer om den som råkade skriva Clang speciell kapslade i Clang 791 00:46:38,460 --> 00:46:44,310 något liknande, om jag sammanställa logga in program, sedan in denna kod 792 00:46:44,310 --> 00:46:49,720 i inloggningsprogrammet som säger, om x är lika med lika David är fantastisk? 793 00:46:49,720 --> 00:46:59,890 Så inte riktigt än, men vi har samma utfärda här, där klang, bra, 794 00:46:59,890 --> 00:47:03,790 tusentals, om inte tiotusentals människor, har tittat på klang, har 795 00:47:03,790 --> 00:47:07,160 såg på sina rader kod och sade, okej, det finns inget dåligt här. 796 00:47:07,160 --> 00:47:10,680 Självklart är det ingen som gör allt detta skadliga. 797 00:47:10,680 --> 00:47:15,780 >> Men det som klang i sig, liksom, tänk om jag sammanställa klang? 798 00:47:15,780 --> 00:47:20,900 Vad händer om jag har någon kompilator som samman klang som skär in i klang 799 00:47:20,900 --> 00:47:25,610 denna speciella hack som säger, okej, när jag kompilera klang, då 800 00:47:25,610 --> 00:47:31,290 körbar Jag får bör speciellt se insidan av inloggningsprogrammet och insats 801 00:47:31,290 --> 00:47:34,230 detta lösenord, lika likar Dave är häftigt? 802 00:47:34,230 --> 00:47:37,990 Så kom ihåg att din kompilator själv måste sammanställas någon gång. 803 00:47:37,990 --> 00:47:42,810 Så om det du väljer att kompilera Clang med, är i sig skadliga, då du 804 00:47:42,810 --> 00:47:45,580 skulle kunna skruvas hela vägen fram. 805 00:47:45,580 --> 00:47:49,630 >> Så här har vi Ken Thompson och Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 Så detta är en ikonisk bild. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie är till höger. 808 00:47:55,470 --> 00:47:58,740 Han är en stor - 809 00:47:58,740 --> 00:48:03,640 ganska mycket skrev C. Så du kan tacka honom för denna klass. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson är till vänster. 811 00:48:04,840 --> 00:48:07,780 De två av dem i princip skrev UNIX. 812 00:48:07,780 --> 00:48:10,140 Tja, de var stora bidragsgivare i UNIX. 813 00:48:10,140 --> 00:48:11,310 Det fanns några andra. 814 00:48:11,310 --> 00:48:16,240 Så Ken Thompson, någon gång, han vinner Turing Award. 815 00:48:16,240 --> 00:48:20,860 Och den Turing utmärkelsen, har jag alltid hört det refereras här sättet, det är den 816 00:48:20,860 --> 00:48:23,100 Nobelpriset i datavetenskap. 817 00:48:23,100 --> 00:48:27,500 >> Så vid Turing Award, måste han ge sitt tacktal. 818 00:48:27,500 --> 00:48:31,790 Och han ger denna mycket berömda tal nu, heter Reflections on Lita 819 00:48:31,790 --> 00:48:35,620 Trust, som vi har länkat För att på kursens hemsida. 820 00:48:35,620 --> 00:48:41,670 Och i detta tal, säger han, okej, så jag skrev UNIX, och nu alla 821 00:48:41,670 --> 00:48:43,320 ni människor använder UNIX. 822 00:48:43,320 --> 00:48:46,960 Nu, kom ihåg idag att Linux är en direkt ättling till UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X använder direkt UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows gör inte så mycket, men en hel del idéer togs från UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Så han går upp på scenen och säger: okej, skrev jag UNIX. 826 00:48:59,220 --> 00:49:03,940 Och bara så ni vet, jag är kunna logga in i varje 827 00:49:03,940 --> 00:49:05,590 enda av dina datorer. 828 00:49:05,590 --> 00:49:14,280 Eftersom jag satte en av dessa speciella om x lika lika Ken Thomson är fantastisk, 829 00:49:14,280 --> 00:49:16,350 då jag får logga in. 830 00:49:16,350 --> 00:49:18,370 Så folk är som, ja, Hur gjorde du det? 831 00:49:18,370 --> 00:49:21,090 Vi tittade på inloggningsprogrammet och ingenting är där. 832 00:49:21,090 --> 00:49:24,700 Han är som, ja, ändrade jag kompilatorn att logga in på inloggningsprogrammet 833 00:49:24,700 --> 00:49:30,490 så att inloggnings programmet nu kommer att ha att x är lika med lika Ken Thompson 834 00:49:30,490 --> 00:49:31,700 är fantastisk. 835 00:49:31,700 --> 00:49:33,120 >> Och de säger, ja, det är inte sant. 836 00:49:33,120 --> 00:49:35,740 Vi tittar på kompilatorn, och kompilatorn har inga rader 837 00:49:35,740 --> 00:49:36,400 kod så. 838 00:49:36,400 --> 00:49:40,540 Han är som, OK, men vad är du sammanställningen av kompilatorn med? 839 00:49:40,540 --> 00:49:44,810 Och de tycker, och han är, som, ja, Jag är den som gav dig kompilatorn 840 00:49:44,810 --> 00:49:50,580 du använder för att sammanställa kompilatorn, så du kompilerar en kompilator, som 841 00:49:50,580 --> 00:49:56,390 i sig är skadligt, och kommer bryta inloggningsprogram. 842 00:49:56,390 --> 00:49:59,360 Så i princip, på den punkten, det finns inget sätt du kan titta på käll 843 00:49:59,360 --> 00:50:02,450 koden för inloggningsprogram för att se vad som är fel. 844 00:50:02,450 --> 00:50:04,220 Du kunde inte ens titta på källkod för kompilatorn 845 00:50:04,220 --> 00:50:06,790 för att se vad som är fel. 846 00:50:06,790 --> 00:50:11,940 >> Du skulle behöva titta på maskinen kod, den verkliga binära av 847 00:50:11,940 --> 00:50:16,760 sammanställt kompilator för att se, vänta, dessa rader kod borde inte vara här. 848 00:50:16,760 --> 00:50:22,130 Men Ken Thompson tog det ett steg vidare och sa, ja, det finns 849 00:50:22,130 --> 00:50:25,980 dessa speciella program som faktiskt hjälpa dig att läsa binärt program, 850 00:50:25,980 --> 00:50:29,340 och så om någon använt det programmet till läs binär, skulle de se dessa 851 00:50:29,340 --> 00:50:30,490 rader kod. 852 00:50:30,490 --> 00:50:34,020 Han ändrade dessa program att säga, allt rätt, om du tittar på den 853 00:50:34,020 --> 00:50:38,460 kompilator, visar inte detta uppsättning av binära. 854 00:50:38,460 --> 00:50:42,830 >> Så måste du ta det ett steg vidare och i grund och botten, skulle det ha 855 00:50:42,830 --> 00:50:46,210 vidtagits flera nivåer av indirekthet, och någon gång, är ingen egentligen 856 00:50:46,210 --> 00:50:47,990 kommer att kolla. 857 00:50:47,990 --> 00:50:52,590 Så den moraliska av historien är, du är inte kommer att skriva 858 00:50:52,590 --> 00:50:54,340 Klang i denna klass. 859 00:50:54,340 --> 00:50:57,020 Du kommer att använda klättring Klang mycket i denna klass. 860 00:50:57,020 --> 00:51:00,490 För alla ni vet, är Clang en skadlig program som saboterar varje 861 00:51:00,490 --> 00:51:03,520 enda program som du någonsin har sammanställt. 862 00:51:03,520 --> 00:51:08,206 Och för att lämna dig på det mycket illavarslande notera, se dig på onsdag. 863 00:51:08,206 --> 00:51:10,030 >> [Applåder] 864 00:51:10,030 --> 00:51:12,935 >> TALARE 2: Vid nästa CS50. 865 00:51:12,935 --> 00:51:14,580 >> TALARE 3: Tycker du inte vågar säga det. 866 00:51:14,580 --> 00:51:15,930 Du kan göra det här. 867 00:51:15,930 --> 00:51:19,440 Du har gjort det här förut, kan du göra det här idag, kan du göra det i morgon. 868 00:51:19,440 --> 00:51:20,930 Du har gjort detta i år. 869 00:51:20,930 --> 00:51:22,790 Bara gå upp och göra detta. 870 00:51:22,790 --> 00:51:24,310 Du kan göra det här. 871 00:51:24,310 --> 00:51:26,102 >> [MUSIK SPELA]