1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [Musikgengivelse] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: Okay. 4 00:00:12,100 --> 00:00:15,620 Så første første video fra et velkendt ansigt. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [VIDEOAFSPILNING] 7 00:00:22,560 --> 00:00:23,370 >> -Okay. 8 00:00:23,370 --> 00:00:27,150 Dette er CS50, og det er begyndelsen af ​​uge tre. 9 00:00:27,150 --> 00:00:29,980 Jeg er ked af jeg ikke kunne være der med dig i dag, men tillad mig at introducere 10 00:00:29,980 --> 00:00:32,880 CS50 egen Rob Boden. 11 00:00:32,880 --> 00:00:33,872 >> [END VIDEOAFSPILNING] 12 00:00:33,872 --> 00:00:39,340 >> [Applaus og cheers] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: Den filmografi i at videoen er fantastisk. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Ok. 16 00:00:47,770 --> 00:00:50,960 Så det første, der er en anden frokost. 17 00:00:50,960 --> 00:00:52,330 Det er i morgen kl 1:15. 18 00:00:52,330 --> 00:00:54,480 Der er ingen frokost denne fredag. 19 00:00:54,480 --> 00:00:55,810 Det er med Quora. 20 00:00:55,810 --> 00:01:00,190 Og Tommy er ikke kommet endnu, men en af de mennesker, der er tidligere leder CF 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Så han er en sjov fyr. 23 00:01:02,730 --> 00:01:04,819 Du skulle komme. 24 00:01:04,819 --> 00:01:05,900 >> Ok. 25 00:01:05,900 --> 00:01:11,360 Så i sidste uge, begyndte vi at bryde fra hinanden om, hvad en streng egentlig er. 26 00:01:11,360 --> 00:01:14,830 Vi har kendt siden begyndelsen, at Det er en sekvens af tegn. 27 00:01:14,830 --> 00:01:18,130 Men i sidste uge, vi dykket ned i faktum at det virkelig er en sekvens af 28 00:01:18,130 --> 00:01:22,110 tegn, godt, vi nu har arrays af tegn. 29 00:01:22,110 --> 00:01:26,450 Og vi ved, at en streng, det er et array tegn, til allersidst, 30 00:01:26,450 --> 00:01:30,920 vi har denne specielle null byte, dette backslash 0, der angiver slutningen af 31 00:01:30,920 --> 00:01:32,230 strengen. 32 00:01:32,230 --> 00:01:36,970 >> Og så en streng er en vifte af tegn, men vi kan have mere end 33 00:01:36,970 --> 00:01:39,530 bare en vifte af figurer, vi kan få en bred vifte af enhver 34 00:01:39,530 --> 00:01:40,890 type ting, vi ønsker. 35 00:01:40,890 --> 00:01:51,570 Så hvis du husker fra sidste uge, Ages program, David introduceret 36 00:01:51,570 --> 00:01:53,560 virkelig hurtigt. 37 00:01:53,560 --> 00:01:57,010 Så første ting, vi kommer til at gøre, er bede brugeren om et heltal, den 38 00:01:57,010 --> 00:01:58,800 Antallet af mennesker i lokalet. 39 00:01:58,800 --> 00:02:01,260 Når vi har at heltal, vi erklære et array. 40 00:02:01,260 --> 00:02:02,890 Bemærk dette beslag syntaks. 41 00:02:02,890 --> 00:02:04,540 Du kommer til at vænne sig til det. 42 00:02:04,540 --> 00:02:09,430 >> Så vi erklære et array af heltal kaldet aldre, og der er n 43 00:02:09,430 --> 00:02:12,080 heltal i dette array. 44 00:02:12,080 --> 00:02:16,480 Så dette mønster lige her, er dette 4 int Jeg er lig 0, jeg er mindre end n, jeg plus 45 00:02:16,480 --> 00:02:20,580 plus, er der også kommer til at være et mønster at du meget vænne sig til. 46 00:02:20,580 --> 00:02:24,000 Fordi det er temmelig meget, hvordan du er altid kommer til at gentage over arrays. 47 00:02:24,000 --> 00:02:26,330 Så husk, at n er længden af ​​vores array. 48 00:02:26,330 --> 00:02:32,120 Og så her er vi gentagne gange anmodet for en alder af person, jeg i rummet. 49 00:02:32,120 --> 00:02:36,640 >> Efter dette, går vi ned, og uanset vilkårlig grund, vi så 50 00:02:36,640 --> 00:02:40,220 udskrive hvor gamle de skal hen at være et år fra nu. 51 00:02:40,220 --> 00:02:49,980 Og kører dette program, så lad os lave aldre, dot slash aldre. 52 00:02:49,980 --> 00:02:53,010 Så antallet af personer i rummet, lad os sige, at der er tre. 53 00:02:53,010 --> 00:02:59,880 Og sige, den første person er 13, næste er 26, og den sidste er 30.. 54 00:02:59,880 --> 00:03:05,080 Så det vil gentage over disse tre folk, udskrive 14, 27, og 31. 55 00:03:05,080 --> 00:03:16,060 >> Så husk, at når vi erklærer en vifte af størrelse n, indeksene i denne 56 00:03:16,060 --> 00:03:19,950 array, array har værdier, og indeks 0, 1, 2, hele vejen 57 00:03:19,950 --> 00:03:21,680 op til n minus 1. 58 00:03:21,680 --> 00:03:26,255 Så når vi sagde, at der var tre mennesker i rummet, og vi sætter ind her 59 00:03:26,255 --> 00:03:29,850 den første iteration gennem denne loop, er jeg kommer til at være 0. 60 00:03:29,850 --> 00:03:31,650 Så i indeks 0. 61 00:03:31,650 --> 00:03:34,540 Vi tildeler den første ældes brugeren indtaster. 62 00:03:34,540 --> 00:03:38,870 Derefter i den næste, vi kommer ind i sekund n brugeren indtaster, og i 63 00:03:38,870 --> 00:03:40,580 siden af ​​to, den sidste n. 64 00:03:40,580 --> 00:03:44,200 >> Så bemærke, at en bred vifte af størrelse tre ikke har noget 65 00:03:44,200 --> 00:03:46,040 i indekset tre. 66 00:03:46,040 --> 00:03:49,036 Dette er ikke gyldigt. 67 00:03:49,036 --> 00:03:50,250 Ok. 68 00:03:50,250 --> 00:03:55,136 Så gå tilbage her. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Så nu, at vi har behandlet arrays, vi har et vist kendskab. 71 00:04:01,590 --> 00:04:03,780 Nu vil vi gå videre til kommando line argumenter, som der vil være 72 00:04:03,780 --> 00:04:05,890 temmelig relevant for dette problem sæt. 73 00:04:05,890 --> 00:04:09,670 >> Så indtil nu, når du har erklæret din vigtigste funktion, vi har 74 00:04:09,670 --> 00:04:11,230 sagde int main tomrum. 75 00:04:11,230 --> 00:04:14,070 Så tomrum betyder blot, at vi er ikke passerer nogen 76 00:04:14,070 --> 00:04:16,440 argumenter denne funktion. 77 00:04:16,440 --> 00:04:19,190 Nu vil vi se, at hoved kan tage nogle argumenter. 78 00:04:19,190 --> 00:04:22,470 Her kalder vi dem int argc og streng argv parentes. 79 00:04:22,470 --> 00:04:26,930 Beslagene igen angivelse at vi har at gøre med arrays. 80 00:04:26,930 --> 00:04:31,850 Så her, snor argv parentes, er vi beskæftiger sig med en bred vifte af strenge. 81 00:04:31,850 --> 00:04:35,360 Så argc, er, at kommer til at angive hvor mange argumenter, vi har 82 00:04:35,360 --> 00:04:37,580 videregives til dette program. 83 00:04:37,580 --> 00:04:46,050 Og for at se, hvad det betyder, lad os lukke dette. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Så indtil nu, har vi køre hver program som dot slash aldre. 86 00:04:50,790 --> 00:04:55,250 Vi kan også, på kommandolinjen, forbi overfører argumenter, således udtrykket, kommando 87 00:04:55,250 --> 00:04:56,550 line argumenter. 88 00:04:56,550 --> 00:04:59,760 Så det første argument, hej verden. 89 00:04:59,760 --> 00:05:03,350 Så her ville argc være tre. 90 00:05:03,350 --> 00:05:07,720 Det er optællingen af ​​de argumenter, på kommandolinjen. 91 00:05:07,720 --> 00:05:12,840 Argc er altid mindst 1, da dot slash aldre, selv tæller som ét af 92 00:05:12,840 --> 00:05:14,490 kommandolinje-argumenter. 93 00:05:14,490 --> 00:05:17,010 >> Så hej er den første. 94 00:05:17,010 --> 00:05:20,460 Hvis dot slash aldre er nulte, så hej er den første, og verden er 95 00:05:20,460 --> 00:05:22,830 anden kommandolinje argument. 96 00:05:22,830 --> 00:05:29,490 Så strengen argv, vi kommer til at se, indeholder strenge, dot skråstreg 97 00:05:29,490 --> 00:05:33,830 aldre, hej, og verden. 98 00:05:33,830 --> 00:05:38,945 Og ved Davids anmodning, vil vi at afspille en video indføre det. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [VIDEOAFSPILNING] 101 00:05:43,890 --> 00:05:46,240 >> -Indtil nu i programmer, vi har holdt skrevet, har vi erklære 102 00:05:46,240 --> 00:05:48,500 main som int main tomrum. 103 00:05:48,500 --> 00:05:51,170 Og al den tid, det tomrum har simpelthen været det fremgår, at 104 00:05:51,170 --> 00:05:54,430 Programmet tager ikke kommandolinjeargumenter. 105 00:05:54,430 --> 00:05:57,750 Med andre ord, når en bruger kører et program, kan han eller hun giver kommando 106 00:05:57,750 --> 00:06:01,710 line argumenter ved at skrive ekstra ord eller sætninger efter programmets 107 00:06:01,710 --> 00:06:03,000 navn ved prompten. 108 00:06:03,000 --> 00:06:06,550 >> Tja, hvis du ønsker du dit program til tage kommandolinjeargumenter, en eller 109 00:06:06,550 --> 00:06:10,540 flere sådanne ord har vi brug for at erstatte ugyldig med et par argumenter. 110 00:06:10,540 --> 00:06:12,200 Så lad os gøre det. 111 00:06:12,200 --> 00:06:15,750 Medtag CS50.h. 112 00:06:15,750 --> 00:06:19,360 Medtag standard io.h. 113 00:06:19,360 --> 00:06:20,760 Int main. 114 00:06:20,760 --> 00:06:26,330 Og nu, i stedet for tomrum, jeg har tænkt mig at specificere en int kaldet argc, og en 115 00:06:26,330 --> 00:06:28,780 vifte af strenge kaldes argv. 116 00:06:28,780 --> 00:06:31,820 Nu argc og argv er simpelthen konventioner. 117 00:06:31,820 --> 00:06:34,000 >> Vi kunne have kaldt disse argumenter de fleste noget, vi ønsker. 118 00:06:34,000 --> 00:06:37,630 Men hvad der er vigtigt, er, at argc er en int fordi, per definition, er det 119 00:06:37,630 --> 00:06:41,360 kommer til at indeholde argumentet feltet den antallet af ord i alt at 120 00:06:41,360 --> 00:06:43,380 brugeren har indtastet på hans eller hendes prompt. 121 00:06:43,380 --> 00:06:47,910 argv, i mellemtiden, vektor argument er vil faktisk være et array opbevaring 122 00:06:47,910 --> 00:06:52,020 alle de ord, som brugeren har skrevet på hans eller hendes prompt. 123 00:06:52,020 --> 00:06:54,500 >> Lad os gå videre til at gøre noget nu med en eller flere af disse 124 00:06:54,500 --> 00:06:55,660 kommandolinjeargumenter. 125 00:06:55,660 --> 00:07:00,070 I særdeleshed, lad os gå videre og udskrive uanset ord brugeren typer 126 00:07:00,070 --> 00:07:03,960 efter programmets navn ved prompten. 127 00:07:03,960 --> 00:07:04,730 Åbneparentes. 128 00:07:04,730 --> 00:07:06,240 Luk beslag. 129 00:07:06,240 --> 00:07:10,510 Printf procent s omvendt skråstreg og komma. 130 00:07:10,510 --> 00:07:14,550 Og nu har jeg brug for at fortælle printf hvilken værdi til at sætte i denne pladsholder. 131 00:07:14,550 --> 00:07:18,600 Jeg vil have det første ord, som brugeren har skrevet efter programmets navn, 132 00:07:18,600 --> 00:07:23,130 og så jeg har tænkt mig at specificere argv beslag 1 tæt 133 00:07:23,130 --> 00:07:24,830 parentes, semikolon. 134 00:07:24,830 --> 00:07:27,290 >> Nu, hvorfor beslag 1 og ikke beslag 0? 135 00:07:27,290 --> 00:07:30,990 Tja, det viser sig, gemmes automatisk i argv 0 kommer til at være den 136 00:07:30,990 --> 00:07:32,620 programmets faktiske navn. 137 00:07:32,620 --> 00:07:36,180 Så det første ord, brugeren skriver efter programmets navn er, ved 138 00:07:36,180 --> 00:07:38,990 konvention, kommer til at være lagret i argv 1. 139 00:07:38,990 --> 00:07:42,380 Lad os nu kompilere og køre dette program. 140 00:07:42,380 --> 00:07:47,780 >> Gør argv 0, dot skråstreg argv 0. 141 00:07:47,780 --> 00:07:50,520 Og nu et ord som hej. 142 00:07:50,520 --> 00:07:51,670 Enter. 143 00:07:51,670 --> 00:07:53,520 Og der har vi det, hej. 144 00:07:53,520 --> 00:07:55,750 >> [END VIDEOAFSPILNING] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: Okay. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Luk det. 148 00:08:01,230 --> 00:08:16,730 Så tage et kig på det program, der vi bare introduceret til os, ja, bare 149 00:08:16,730 --> 00:08:24,710 for at vise, hvis vi udskriver argv 0, gøre, nu hvad er det, argv 0, dot skråstreg argv 0. 150 00:08:24,710 --> 00:08:30,440 Så, som forventet, er det at udskrive navnet på det program, da argv 0 er 151 00:08:30,440 --> 00:08:32,970 altid vil være den navn på programmet. 152 00:08:32,970 --> 00:08:35,640 Men lad os gøre noget bit mere interessant. 153 00:08:35,640 --> 00:08:42,080 >> Så i problemet sæt, vil du blive introduceret til denne funktion, atoi. 154 00:08:42,080 --> 00:08:44,440 Så hvad bruger vi atoi efter? 155 00:08:44,440 --> 00:08:48,550 Det kommer til at konvertere en streng til et heltal. 156 00:08:48,550 --> 00:08:53,280 Så hvis jeg passerer strengen, en to tre, til atoi, vil der konverterer, at 157 00:08:53,280 --> 00:08:56,910 til heltal, en to tre. 158 00:08:56,910 --> 00:09:01,480 Så vi kommer til at konvertere den første kommandolinjeargument til et heltal, 159 00:09:01,480 --> 00:09:05,690 og så bare udskrive denne heltal. 160 00:09:05,690 --> 00:09:09,680 >> Så dybest set er vi slags omimplementere getint, bare 161 00:09:09,680 --> 00:09:12,350 heltal indtastes på kommando linje i stedet for i programmet 162 00:09:12,350 --> 00:09:14,560 interaktivt. 163 00:09:14,560 --> 00:09:23,170 Så gør argv 0, lad os gøre det her, og luk det. 164 00:09:23,170 --> 00:09:27,670 Så kører argv 0, og lad os komme ind i heltal, en to tre fire ene to. 165 00:09:27,670 --> 00:09:30,840 Så det vil udskrive heltal, en to tre fire ene to. 166 00:09:30,840 --> 00:09:35,500 Der er nogle finesser at atoi at det vil stoppe bekymre sig om noget 167 00:09:35,500 --> 00:09:39,040 ud over en gyldig numerisk tegn, men det betyder ikke noget. 168 00:09:39,040 --> 00:09:42,870 >> Så hvad tror du der sker hvis jeg gør dette? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Segmenteringsfejl. 171 00:09:47,050 --> 00:09:50,410 Så hvorfor er det? 172 00:09:50,410 --> 00:09:56,060 Hvis man ser tilbage på vores program, er vi konvertering argv 1, første argument 173 00:09:56,060 --> 00:09:59,610 efter navnet programmet til et heltal. 174 00:09:59,610 --> 00:10:03,350 Men der er noget argument passeret efter programmets navn. 175 00:10:03,350 --> 00:10:08,060 Så her ser vi, at dette er en buggy programmet, da, hvis vi forsøger at køre det 176 00:10:08,060 --> 00:10:10,530 uden nogen argumenter, vil det bare gå ned. 177 00:10:10,530 --> 00:10:16,950 >> Så en anden fælles mønster, du vil se er noget lignende, hvis argc er mindre 178 00:10:16,950 --> 00:10:21,100 end to, indikerer, at der ikke var mindst navnet og et program 179 00:10:21,100 --> 00:10:29,100 første argument, så vil vi gøre noget ligesom printf, ikke nok 180 00:10:29,100 --> 00:10:31,190 kommandolinjeargumenter. 181 00:10:31,190 --> 00:10:33,170 Det er formentlig ikke en god en til at udskrive, det er nok noget, som 182 00:10:33,170 --> 00:10:35,440 skal du indtaste et heltal på kommandolinjen. 183 00:10:35,440 --> 00:10:37,450 Jeg vil bare ende det der. 184 00:10:37,450 --> 00:10:39,600 Og derefter vende tilbage 1.. 185 00:10:39,600 --> 00:10:44,740 Så husk, at ved udgangen af ​​vores program, hvis vi vende tilbage 0, den slags 186 00:10:44,740 --> 00:10:47,060 angiver succes. 187 00:10:47,060 --> 00:10:50,940 Og vigtigste også automatisk returnerer 0 hvis du ikke gør. 188 00:10:50,940 --> 00:10:55,800 >> Så her er vi retuning 1 for at angive at det ikke er succes. 189 00:10:55,800 --> 00:11:01,000 Og du kan vende tilbage, hvad du vil, bare, 0 angiver succes, og 190 00:11:01,000 --> 00:11:03,390 andet indikerer fejl. 191 00:11:03,390 --> 00:11:04,855 Så lad os køre denne version af tingene. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Så nu, hvis vi ikke indtaste en kommando linje argument, vil det rigtigt fortælle 194 00:11:16,600 --> 00:11:18,290 os, ikke nok kommandolinje. 195 00:11:18,290 --> 00:11:20,610 Fandt du ikke afslutte sætningen. 196 00:11:20,610 --> 00:11:24,950 Else, hvis vi rent faktisk give det en, det kan gennemføre programmet. 197 00:11:24,950 --> 00:11:27,920 Så dette er, hvordan du ville bruge argc i For at validere antallet af 198 00:11:27,920 --> 00:11:30,630 kommandolinjeargumenter, faktisk bestået. 199 00:11:30,630 --> 00:11:39,360 >> Så lad os gøre dette program en smule mere kompliceret, og se på det andet 200 00:11:39,360 --> 00:11:42,180 iteration af tingene. 201 00:11:42,180 --> 00:11:46,310 Så nu, at vi ikke bare udskrive første kommandolinje argument. 202 00:11:46,310 --> 00:11:51,210 Her er vi iteration fra int i ligemænd 0, i er mindre end argc, jeg plus 203 00:11:51,210 --> 00:11:55,280 plus, og trykning argv, indeks i. 204 00:11:55,280 --> 00:11:59,300 Så dette mønster, igen, er det samme mønster som før, undtagen i stedet 205 00:11:59,300 --> 00:12:02,600 kalde variablen n bruger vi argc. 206 00:12:02,600 --> 00:12:09,520 >> Så dette er iteration over hver indeks i arrayet, og udskrivning af hver 207 00:12:09,520 --> 00:12:11,910 element i denne matrix. 208 00:12:11,910 --> 00:12:20,300 Og så, når vi kører dette program, ja, Jeg gik ikke ind nogen kommandolinie 209 00:12:20,300 --> 00:12:22,540 argumenter, så det bare prints programmets navn. 210 00:12:22,540 --> 00:12:26,053 Hvis jeg indtaster en masse ting, det vil udskrive én, hver på sin egen linje. 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å lad os tage et skridt videre. 214 00:12:34,770 --> 00:12:38,890 Og i stedet for at udskrive hvert argument på sin egen linje, lad os udskrive hver 215 00:12:38,890 --> 00:12:42,590 karakter af hvert argument på sin egen linje. 216 00:12:42,590 --> 00:12:46,700 Så husk at argv er en vifte af strenge. 217 00:12:46,700 --> 00:12:50,960 Så hvad er en streng, men et array af tegn? 218 00:12:50,960 --> 00:12:57,140 Så det betyder, at argv er virkelig en matrix af et array af tegn. 219 00:12:57,140 --> 00:13:04,920 Så drage fordel af det, lad os ignorere dette for nu. 220 00:13:04,920 --> 00:13:08,190 Lad os lige overveje strengen argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Så hvis vi ønsker at bringe hver karakter argv 0 på sin egen linje, så vil jeg 222 00:13:14,170 --> 00:13:19,500 at gøre det mønster, vi er vant til, jeg er mindre end længden af ​​array, 223 00:13:19,500 --> 00:13:23,990 som her er strlen af, det er ikke, hvad jeg ønsker at gøre, snor 224 00:13:23,990 --> 00:13:26,450 s lig argv 0. 225 00:13:26,450 --> 00:13:30,390 Så jeg er mindre end længden af ​​vores array, som i dette tilfælde er en matrix 226 00:13:30,390 --> 00:13:34,410 tegn, jeg plus plus. 227 00:13:34,410 --> 00:13:41,040 Og så, som vi så i sidste uge, er det ideelt hvis vi flytter at strlen udenfor 228 00:13:41,040 --> 00:13:45,210 Den tilstand, vil da n tilføje den strlen af ​​s hver gang vi gå 229 00:13:45,210 --> 00:13:47,720 gennem løkken, og det er ikke kommer til at ændre sig. 230 00:13:47,720 --> 00:13:50,230 Så vi vil sætte det lig med n herovre. 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 er vi iteration i hvert indeks i array'et. 234 00:14:01,320 --> 00:14:05,630 Og så, hvis vi ønsker at udskrive hver karakter i den pågældende matrix, procent c er 235 00:14:05,630 --> 00:14:06,880 flaget vi ønsker at bruge for tegn. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 Og nu et beslag jeg kommer til at være den streng, indeks karakter i, så hvis 238 00:14:19,770 --> 00:14:20,970 snor var hej. 239 00:14:20,970 --> 00:14:27,530 så s 0 vil være h, s beslag 1 vil være e, og så videre. 240 00:14:27,530 --> 00:14:30,800 >> Så nu er vi ønsker at kombinere disse to ting. 241 00:14:30,800 --> 00:14:35,440 Vi ønsker at udskrive hver karakter af hver kommandolinje argument. 242 00:14:35,440 --> 00:14:38,950 Så vi bliver nødt til en indlejret for løkke. 243 00:14:38,950 --> 00:14:47,480 Og konventionelt, den første tæller er mig, det næste bliver j, n 244 00:14:47,480 --> 00:14:54,450 vil være strlen af ​​argv i, i er mindre end n, jeg plus plus. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 Og nu i stedet for trykning argv i, så argv beslag Jeg kommer til at indeksere - 247 00:15:06,870 --> 00:15:14,280 der kommer til at være det i'te kommandolinje argument argv i, j vil 248 00:15:14,280 --> 00:15:16,925 være den j'te karakter det i'te argument. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Jeg vil slippe af med dette op her nu da vi sætter det ind i denne løkke. 251 00:15:24,810 --> 00:15:33,900 Så svarer til strengen s ligemænd argv i, og derefter s beslag j. 252 00:15:33,900 --> 00:15:36,980 >> Nå, behøver vi ikke at erklære denne variabel s. 253 00:15:36,980 --> 00:15:44,530 I stedet vil vi bare kombinere disse to i, hvad vi havde, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> SPEAKER 1: [uhørligt]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: God opkald. 257 00:15:49,680 --> 00:15:52,936 Så dette er brudt. 258 00:15:52,936 --> 00:15:55,510 Hvis jeg kørte faktisk det, vi ville har indset dette. 259 00:15:55,510 --> 00:16:01,210 Så tæller jeg ligeglad i dette til 260 00:16:01,210 --> 00:16:05,410 løkke er j, iterator. 261 00:16:05,410 --> 00:16:08,560 Så du ville have kørt ind i problemer, sandsynligvis en uendelig løkke, hvis vi 262 00:16:08,560 --> 00:16:09,540 ikke havde fastsat det. 263 00:16:09,540 --> 00:16:12,220 Det er derfor, vi også taler om debugging dag. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Så lad os køre dette program. 266 00:16:15,240 --> 00:16:21,200 Og lad os faktisk tilføje en særskilt printf lige her, der vil bare udskrive 267 00:16:21,200 --> 00:16:27,480 en anden linje, da dette betyder, at når vi køre programmet, vil der være en tom 268 00:16:27,480 --> 00:16:31,830 linje mellem hver karakter hver kommandolinje argument. 269 00:16:31,830 --> 00:16:33,448 Nå, vil vi se, hvad det betyder. 270 00:16:33,448 --> 00:16:37,310 271 00:16:37,310 --> 00:16:37,790 PK. 272 00:16:37,790 --> 00:16:39,870 Fik nogle fejl. 273 00:16:39,870 --> 00:16:42,860 Fejl implicit erklære biblioteksfunktionen strlen. 274 00:16:42,860 --> 00:16:51,630 >> Så gå tilbage ind i vores program, jeg glemte at hash omfatte string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 Så string.h kommer til at være den header fil, der erklærer 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, det kompilerer. 280 00:17:06,060 --> 00:17:09,109 Nu, lad os køre den. 281 00:17:09,109 --> 00:17:10,930 Så netop det. 282 00:17:10,930 --> 00:17:17,790 Det kommer til at udskrive vores program navn, hej verden. 283 00:17:17,790 --> 00:17:23,510 Det kommer til at udskrive hver ting, hver karakter, på sin egen linje. 284 00:17:23,510 --> 00:17:24,540 OK. 285 00:17:24,540 --> 00:17:30,625 >> Så lad os faktisk tage dette et skridt videre. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 Og i stedet for at bruge string.h, lad os tænke over, hvordan vi ville gennemføre vores egen 288 00:17:39,700 --> 00:17:41,420 strlen funktion. 289 00:17:41,420 --> 00:17:45,600 Så jeg vil straks giver en funktion signatur. 290 00:17:45,600 --> 00:17:52,900 Så lad os kalde i my_strlen, og det er kommer til at tage en streng som argument, 291 00:17:52,900 --> 00:17:57,220 og vi forventer at vende tilbage Længden af ​​denne streng. 292 00:17:57,220 --> 00:18:03,430 Så hvor er den fyr? 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å husker fra tidligere dias, var også fra i sidste uge, at en 296 00:18:12,900 --> 00:18:18,890 vifte af tegn, ja, en streng, så lad os sige det er vores streng s. 297 00:18:18,890 --> 00:18:29,870 Så hvis s er den streng, goddag, så H-E-L-L-O, i hukommelsen, der kommer til at 298 00:18:29,870 --> 00:18:35,610 være, og så er denne omvendt skråstreg 0 tegn. 299 00:18:35,610 --> 00:18:39,170 >> Så hvordan får vi længden af ​​s? 300 00:18:39,170 --> 00:18:43,190 Nå, er det trick på udkig efter dette tilbageslag 0 karakter denne null 301 00:18:43,190 --> 00:18:44,380 terminatoren. 302 00:18:44,380 --> 00:18:50,270 Så algoritmen går at være noget som kun få 303 00:18:50,270 --> 00:18:51,510 nok tegn, - 304 00:18:51,510 --> 00:18:56,180 lad os få denne hånd repræsenterer nogle tæller, lad os kalde denne int længde. 305 00:18:56,180 --> 00:19:00,060 Så starter fra herovre, er vi kommer til at gentage over vores streng. 306 00:19:00,060 --> 00:19:04,100 >> Så det første tegn, det er H, og det er ikke tilbage slash 0, så 307 00:19:04,100 --> 00:19:05,170 længden er 1.. 308 00:19:05,170 --> 00:19:08,050 Gentage til næste tegn, E og det er ikke backslash 0. 309 00:19:08,050 --> 00:19:09,630 Længden er 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 Og endelig kommer vi til backslash 0, og så betyder, ja, 314 00:19:16,690 --> 00:19:17,780 denne streng er overstået. 315 00:19:17,780 --> 00:19:20,130 Så lad os vende tilbage 5. 316 00:19:20,130 --> 00:19:33,630 >> Så rent faktisk gennemfører det første, min n længde er lig 0, min højre hånd. 317 00:19:33,630 --> 00:19:36,088 Og vi kommer til at gentage - 318 00:19:36,088 --> 00:19:38,000 >> SPEAKER 1: [uhørligt] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Åh, skyde. 320 00:19:38,640 --> 00:19:39,870 God opkald. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Så n længde er lig 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Så nu, mens s længde ikke lige og derefter omvendt skråstreg 0. 325 00:19:58,310 --> 00:20:04,660 Så husk, dette omvendt skråstreg 0, er det en faktiske karakter, og det indikerer 326 00:20:04,660 --> 00:20:05,820 enden af ​​strengen. 327 00:20:05,820 --> 00:20:09,850 Ligesom også, backslash n er et virkeligt karakter. 328 00:20:09,850 --> 00:20:14,040 Backslash 0 kommer til at indikere slutningen af ​​vores streng. 329 00:20:14,040 --> 00:20:15,414 Jeg ønsker ikke at sætte det der. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 Og mens s indekseret af længde ikke lig med nul terminator derefter 332 00:20:25,620 --> 00:20:27,130 vi bare at forøge længden. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Så i slutningen af ​​vores program, Længden er i sidste ende kommer til at 335 00:20:34,880 --> 00:20:37,610 være 5 i dette tilfælde. 336 00:20:37,610 --> 00:20:39,210 Og vi bare returnere længde. 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 hernede, det gør jeg ikke gøre my_strlen. 340 00:20:48,290 --> 00:20:50,700 Lad os kompilere det for at sikre alt kører problemfrit. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Var jeg gør i 2? 343 00:20:58,210 --> 00:21:00,565 Eller var at 1? 344 00:21:00,565 --> 00:21:01,940 Det skulle gøre. 345 00:21:01,940 --> 00:21:02,690 Ok. 346 00:21:02,690 --> 00:21:08,490 Så dette er argv 2. 347 00:21:08,490 --> 00:21:11,585 Fungerer som forventet, selv om var, at jeg 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 Denne version af ting afse printf ny linje efter, men det 352 00:21:21,820 --> 00:21:22,910 ikke gøre nogen forskel. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 Så arbejdede som forventet. 355 00:21:25,780 --> 00:21:34,750 >> Nu kan vi endda kombinere et skridt videre, hvor varsel her, ja, 356 00:21:34,750 --> 00:21:38,920 første, vi snuppe strlen af ​​argv i, og så er vi iteration i 357 00:21:38,920 --> 00:21:41,450 hver karakter i denne streng. 358 00:21:41,450 --> 00:21:47,480 Så i stedet for at gøre det, hvad nu hvis vi bare kombinere denne logik for at vente 359 00:21:47,480 --> 00:21:50,740 indtil vi ramte backslash 0 højre ind i denne for-løkke? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Så gentage mens argv i, j gør ikke lig backslash 0. 362 00:22:07,490 --> 00:22:10,680 Så lad os køre det først. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Ok. 365 00:22:21,180 --> 00:22:27,655 Så her er denne betingelse siger - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 lad os klare det. 368 00:22:40,060 --> 00:22:49,140 Så nu, lad dette være vores argv. 369 00:22:49,140 --> 00:22:55,290 Så da jeg løb bare at programmet før, argv er en vifte af strenge. 370 00:22:55,290 --> 00:23:03,100 Og så, hvis jeg kører det med prik skråstreg argv 2, hej verden, så argv 371 00:23:03,100 --> 00:23:07,650 selv er længde 3 til argv nul, hallo, og verden. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> Og inden for hver af disse indeks er selv et array, hvor det vil være 374 00:23:19,660 --> 00:23:23,780 prik, vil dette være skråstreg, ved jeg ikke hvis det var den rigtige retning, jeg 375 00:23:23,780 --> 00:23:25,680 tror ikke, det var. 376 00:23:25,680 --> 00:23:30,110 A-R-V streg, har brug for mere plads. 377 00:23:30,110 --> 00:23:32,570 Lad os skæres i dette array. 378 00:23:32,570 --> 00:23:38,230 A-R-V dash 0 og derefter omvendt skråstreg 0. 379 00:23:38,230 --> 00:23:43,160 Og så i uorden vil være hej. 380 00:23:43,160 --> 00:23:45,910 Lad os sige, H-E backslash 0. 381 00:23:45,910 --> 00:23:51,130 Og endelig, W-O omvendt skråstreg 0. 382 00:23:51,130 --> 00:23:59,730 >> Så den algoritme, som vi lige har skrevet, den indlejret efter sløjfer, hvad de er 383 00:23:59,730 --> 00:24:07,321 gør er, at vi først har imødegå i og derefter j. 384 00:24:07,321 --> 00:24:15,206 Dette ville være lettere med kode på skærm, lad os gå tilbage til dette. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 Så bemærke, at jeg er den iterator, der er iteration over hver kommando 387 00:24:24,600 --> 00:24:25,610 line argument. 388 00:24:25,610 --> 00:24:28,870 Og j er iterator iteration over hver karakter, idet 389 00:24:28,870 --> 00:24:30,410 kommandolinje argument. 390 00:24:30,410 --> 00:24:46,755 Så hvad det inderste printf gør er, 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 til at 392 00:24:58,680 --> 00:25:00,670 lige backslash 0. 393 00:25:00,670 --> 00:25:05,730 >> Så vi afslutte det for-løkken, og nu jeg gentager til 1.. 394 00:25:05,730 --> 00:25:10,910 Og nu vil vi udskrive argv 1 0, argv 1 1 - 395 00:25:10,910 --> 00:25:17,040 Nå, nu, da jeg skar hej kort, argv 1 2 igen kommer til at være 396 00:25:17,040 --> 00:25:18,170 backslash 0. 397 00:25:18,170 --> 00:25:25,050 Og så øg jeg og fortsætter, og så videre, indtil vi udskrive alle 398 00:25:25,050 --> 00:25:28,580 verden, og dem er tre kommandolinje argumenter, og vi vil afslutte ud af 399 00:25:28,580 --> 00:25:31,670 den yderste sløjfe, og afslutte vores 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å lad os komme tilbage her. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Så du vil få et vist kendskab til kommandolinje argumenter på dette 406 00:25:52,370 --> 00:25:54,460 særligt problem indstillet. 407 00:25:54,460 --> 00:25:56,630 >> Nu, debugging. 408 00:25:56,630 --> 00:26:01,680 Så har du sikkert allerede har haft at gøre nogle debugging med din tidligere 409 00:26:01,680 --> 00:26:03,120 problem indstillet. 410 00:26:03,120 --> 00:26:08,420 Og en meget nem måde debugging, første, lad os se på et fejlbehæftet program. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Nå, gå gennem dette program, vi kommer til at bede brugeren om et 413 00:26:23,830 --> 00:26:29,350 heltal, grab, at tal, og derefter, vilkårligt, har vi en while-løkke, der 414 00:26:29,350 --> 00:26:32,280 er bare at formindske Jeg indtil det er lig med 10. 415 00:26:32,280 --> 00:26:35,820 Lad os bare antage jeg ind et helt tal større end 10. 416 00:26:35,820 --> 00:26:38,700 Så formindske jeg indtil det er lig med 10. 417 00:26:38,700 --> 00:26:42,630 >> Og så har vi en anden, mens løkken at, mens jeg ikke er lig 0, er vi 418 00:26:42,630 --> 00:26:44,540 kommer til at formindske jeg med 3. 419 00:26:44,540 --> 00:26:49,790 Så hvis du ser hensigten med den bug her, det er, at dette vil formindske i for at 420 00:26:49,790 --> 00:26:57,010 være 10, og derefter dette, mens sløjfen decrement i fra 10 til 7, til 4, til 1, 421 00:26:57,010 --> 00:27:02,880 negativ 2 til negativ 5, og så videre, til negativ uendelig, da jeg vil 422 00:27:02,880 --> 00:27:05,920 faktisk aldrig lig med 0. 423 00:27:05,920 --> 00:27:08,610 Og så i slutningen af ​​dette program, vi har foo funktion, som er 424 00:27:08,610 --> 00:27:12,130 foregår på print ud, at jeg. 425 00:27:12,130 --> 00:27:16,520 >> Så dette er en kort og triviel program, og fejlen er indlysende, 426 00:27:16,520 --> 00:27:18,790 især efter jeg bare sagde hvad fejlen var. 427 00:27:18,790 --> 00:27:24,840 Men hensigten her er, ja, det kan faktisk ligner nogle af dine 428 00:27:24,840 --> 00:27:30,040 løsninger fra grådige fra den sidste problem indstillet, og måske du har 429 00:27:30,040 --> 00:27:32,800 nogle uendelig løkke i dit program, og du har ingen idé 430 00:27:32,800 --> 00:27:34,100 hvad der forårsager det. 431 00:27:34,100 --> 00:27:38,690 Så en meget nyttig debugging teknik er bare at tilføje printfs 432 00:27:38,690 --> 00:27:40,180 hele din kode. 433 00:27:40,180 --> 00:27:49,200 >> Så her jeg vil have en printf udenfor første while-løkke. 434 00:27:49,200 --> 00:27:53,155 Og her vil jeg en printf, og jeg vil bare udskrive jeg. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Jeg vil endda gøre først, mens loop, jeg. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 Udenfor sekund, mens løkken. 439 00:28:09,040 --> 00:28:12,170 Igen, udskrive inde af her, den værdi, jeg. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 Og lad os køre dette. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> Så dot skråstreg debug. 444 00:28:24,800 --> 00:28:25,610 Indtast et heltal. 445 00:28:25,610 --> 00:28:28,150 Lad os gøre 13. 446 00:28:28,150 --> 00:28:28,760 Og boom. 447 00:28:28,760 --> 00:28:33,300 Vi ser, at vi er uendelig looping inde i den anden, mens løkken. 448 00:28:33,300 --> 00:28:36,305 Så nu ved vi, hvad fejlen er. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Men printf debugging er helt fantastisk, men når dine programmer får 451 00:28:45,610 --> 00:28:50,560 længere og mere kompliceret, er der mere avancerede løsninger 452 00:28:50,560 --> 00:28:51,705 få tingene fungerer. 453 00:28:51,705 --> 00:28:52,955 Så lad os fjerne alle disse printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 Og lad os sørge for jeg ikke gjorde bryde noget. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Så det program, vi vil at indføre kaldes 458 00:29:14,180 --> 00:29:16,715 GDB, til GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Tja, faktisk, lad os fjerne debug for et sekund, og at debug igen. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Tja, faktisk først, en god lektion i kommandolinjeargumenter. 463 00:29:34,440 --> 00:29:37,780 Bemærk, at denne Clang kommando, der er kompilering alt bliver passeret 464 00:29:37,780 --> 00:29:41,300 på kommandolinjen, disse kommandolinjeargumenter. 465 00:29:41,300 --> 00:29:46,250 Så præcis, hvordan du skal bruge kommandolinjeargumenter, som vi 466 00:29:46,250 --> 00:29:51,500 gjorde før, og som du vil i PSET 2, det er hvordan Clang bruger dem. 467 00:29:51,500 --> 00:30:00,070 >> Så bemærke, at denne første flag, bindestreg ggdb3, hvad det er at sige er, Dunk, 468 00:30:00,070 --> 00:30:03,790 bør du kompilere denne fil med hensigt, at vi i sidste ende vil 469 00:30:03,790 --> 00:30:05,380 nødt til at debug det. 470 00:30:05,380 --> 00:30:13,840 Så så længe du har det flag, så vi kan GDB debug. 471 00:30:13,840 --> 00:30:17,380 Og det vil åbne op for GNU Debugger. 472 00:30:17,380 --> 00:30:22,920 >> Så der er en masse kommandoer at du har brug for at vænne sig til. 473 00:30:22,920 --> 00:30:27,100 Først den ene, som du sandsynligvis vil straks behøver køres. 474 00:30:27,100 --> 00:30:28,200 Så hvad er Run gøre? 475 00:30:28,200 --> 00:30:30,910 Det kommer til at starte vores program. 476 00:30:30,910 --> 00:30:36,180 Så køre, startende, programmet beder os for et heltal, 13.. 477 00:30:36,180 --> 00:30:39,170 Og så er det uendelig looping som forventet, bortset fra at jeg fjernede 478 00:30:39,170 --> 00:30:40,500 printfs, så vi ikke engang se det. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Forladt 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 er muligt, at det pakket alle de vej rundt, tilbage til - at ignorere det. 484 00:30:53,640 --> 00:30:55,170 Antag det ikke afslutter normalt. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Der er et kompliceret svar på det. 487 00:31:03,370 --> 00:31:07,890 >> Så nu, det er ikke meget nyttig. 488 00:31:07,890 --> 00:31:11,480 Så bare kører vores program inde i denne debugger hjælper os ikke på nogen 489 00:31:11,480 --> 00:31:15,610 måde, da vi kunne bare have gjort dot skråstreg debug udefra GDB. 490 00:31:15,610 --> 00:31:21,250 Så en kommando, der Du vil sikkert - 491 00:31:21,250 --> 00:31:22,970 og jeg vil afslutte dette. 492 00:31:22,970 --> 00:31:25,850 Ctrl-d eller holde op, både arbejde. 493 00:31:25,850 --> 00:31:29,550 Så lad os åbne den op igen. 494 00:31:29,550 --> 00:31:31,130 >> En anden kommando, som du sandsynligvis vil straks ønsker at 495 00:31:31,130 --> 00:31:33,600 vænne sig til, er Break. 496 00:31:33,600 --> 00:31:37,120 Så vi vil bryde den vigtigste for nu, og så vil jeg forklare det. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Nå, her ser vi, at vi sat et breakpoint på denne linie i debug.c. 499 00:31:46,370 --> 00:31:50,160 Så hvad pause betyder er, at når jeg skriv køre, er programmet kommer til at 500 00:31:50,160 --> 00:31:53,560 fortsætte med at køre, indtil Jeg ramte et breakpoint. 501 00:31:53,560 --> 00:31:59,390 Så når jeg ramte løb, starter programmet, og derefter det bryder så snart det 502 00:31:59,390 --> 00:32:01,940 ind i hovedfunktion. 503 00:32:01,940 --> 00:32:06,930 Break vigtigste vil være noget du temmelig almindeligt gøre. 504 00:32:06,930 --> 00:32:11,340 >> Og nu, til at introducere dig nogle flere kommandoer. 505 00:32:11,340 --> 00:32:14,330 Bemærk her, at det siger vi brød på linje 11, der er 506 00:32:14,330 --> 00:32:16,230 printf indtaste et heltal. 507 00:32:16,230 --> 00:32:21,260 Så kommandoen Næste kommer til at være, hvordan vi gå til næste linje kode. 508 00:32:21,260 --> 00:32:24,810 Dette vil give os mulighed for at træde gennem vores program linje for linje. 509 00:32:24,810 --> 00:32:26,260 Så næste. 510 00:32:26,260 --> 00:32:29,820 >> Nu linje 12, vi vil at få heltal. 511 00:32:29,820 --> 00:32:30,450 Næste. 512 00:32:30,450 --> 00:32:34,290 Og hvis du bare trykke Enter igen, vil det redo den sidste ting du gjorde. 513 00:32:34,290 --> 00:32:36,480 Så jeg behøver ikke at skrive næste hver gang. 514 00:32:36,480 --> 00:32:40,100 Så indtaste et heltal, 13.. 515 00:32:40,100 --> 00:32:46,940 Så nu, linje 14, mens jeg er større end 10, og jeg vil gøre næste. 516 00:32:46,940 --> 00:32:48,685 Og vi ser, vi kommer til at formindske jeg. 517 00:32:48,685 --> 00:32:50,210 Så vi kommer til at formindske jeg igen. 518 00:32:50,210 --> 00:32:53,620 >> Så nu, en anden nyttig Kommandoen er Udskriv. 519 00:32:53,620 --> 00:32:55,750 Så Print kommer til at udskrive værdien af ​​variablen. 520 00:32:55,750 --> 00:32:57,825 Lad os bringe ud af værdien variabel i. 521 00:32:57,825 --> 00:32:58,705 Lad os printe jeg. 522 00:32:58,705 --> 00:33:00,910 Det kommer til at sige, at jeg er 11.. 523 00:33:00,910 --> 00:33:03,330 Nu er vi Næste igen, mens i er større end 10. 524 00:33:03,330 --> 00:33:05,590 Så jeg er stadig større end 10, da det er 11. 525 00:33:05,590 --> 00:33:06,920 Jeg minus minus. 526 00:33:06,920 --> 00:33:08,250 Lad os udskrive i igen. 527 00:33:08,250 --> 00:33:10,950 Som forventet, er det 10.. 528 00:33:10,950 --> 00:33:12,510 >> Så nu, næste. 529 00:33:12,510 --> 00:33:16,250 Det kommer tilbage til den tilstand, jeg er større end 10, men jeg er nu 10, så 530 00:33:16,250 --> 00:33:20,040 det er ikke større end 10, så vi forventer det til at falde ud af, mens løkken. 531 00:33:20,040 --> 00:33:22,220 Og nu er vi under denne linje kode. 532 00:33:22,220 --> 00:33:28,750 Og en anden kommando, Liste er bare at vise det forrige og næste 533 00:33:28,750 --> 00:33:31,240 par linjer kode, i Skulle du miste dig selv. 534 00:33:31,240 --> 00:33:35,420 Så vi bare forladt dette, mens loop, og nu har vi indgået dette 535 00:33:35,420 --> 00:33:37,080 mens loop, linie 18. 536 00:33:37,080 --> 00:33:39,860 Så mens jeg ikke er lig 0. 537 00:33:39,860 --> 00:33:46,570 Og næste, jeg lig i minus 3, og vi vil bemærke, vil dette bare holde i gang. 538 00:33:46,570 --> 00:33:48,270 Og vi kan printe jeg. 539 00:33:48,270 --> 00:33:49,990 >> Hver kommando har slags genveje. 540 00:33:49,990 --> 00:33:51,720 Så p er en forkortelse for Print. 541 00:33:51,720 --> 00:33:53,400 Så vi kan p jeg. 542 00:33:53,400 --> 00:33:57,550 Bare holde holde n, eller holde gør Næste. 543 00:33:57,550 --> 00:33:58,340 Udskriv jeg igen. 544 00:33:58,340 --> 00:34:00,380 Du ser nu er det negativ 167. 545 00:34:00,380 --> 00:34:06,030 Så dette vil fortsætte i al evighed, men ikke virkelig evigt, da du lige har set, er det 546 00:34:06,030 --> 00:34:09,330 rent faktisk vil ende på et tidspunkt. 547 00:34:09,330 --> 00:34:15,699 >> Så det er begyndt GDB. 548 00:34:15,699 --> 00:34:19,504 Men lad os gøre én ting mere i GDB. 549 00:34:19,504 --> 00:34:20,754 Uh, debug. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Så i dette særlige tilfælde uendelig løkke sket for at være inde i 552 00:34:28,534 --> 00:34:30,050 hovedfunktion. 553 00:34:30,050 --> 00:34:35,779 Og for nu, bare acceptere, at at jeg er kommer til at bevæge den uendelig løkke i 554 00:34:35,779 --> 00:34:37,029 foo funktionen. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Bare husk, at ved udgangen af ​​dette program, ja, det var oprindelig 557 00:34:43,730 --> 00:34:46,210 ringer foo, der var bare kommer til at udskrive jeg. 558 00:34:46,210 --> 00:34:51,880 Men nu vi kalder foo, der er kommer til at formindske jeg indtil det er 0, og 559 00:34:51,880 --> 00:34:54,548 derefter udskrive denne variabel. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Gem det. 562 00:34:57,970 --> 00:35:00,175 Foretag debug. 563 00:35:00,175 --> 00:35:03,310 Og nu, gdb debug. 564 00:35:03,310 --> 00:35:04,090 OK. 565 00:35:04,090 --> 00:35:10,580 >> Så hvis jeg bare køre så jeg ikke kommer til at være i stand til rent faktisk at gå gennem min 566 00:35:10,580 --> 00:35:11,730 program line-by-line. 567 00:35:11,730 --> 00:35:19,820 Så lad os bryde på main, og skriv derefter løb. 568 00:35:19,820 --> 00:35:28,160 Så gå igennem dette, printf, indtast et heltal, får heltal, 13.. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Så vi vil holde decrementing indtil jeg er større end 10. 571 00:35:37,490 --> 00:35:42,840 Så vi kommer til at falde igennem mens løkken, og komme til den linje - 572 00:35:42,840 --> 00:35:44,364 Lad os åbne det op i et separat vindue. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Så vi dekrementeret indtil jeg ikke længere var større end 10, og så vi 575 00:35:53,300 --> 00:35:55,700 kaldte funktionen foo. 576 00:35:55,700 --> 00:36:01,340 >> Så hvad skete der så snart jeg ramte funktion foo, ja, jeg hedder foo, og 577 00:36:01,340 --> 00:36:04,030 så jeg ikke længere havde kontrol over GDB. 578 00:36:04,030 --> 00:36:10,230 Så så snart jeg ramt på Næste på denne linje, tingene fortsatte indtil dette skete, 579 00:36:10,230 --> 00:36:12,400 hvor programmet forlades, når - 580 00:36:12,400 --> 00:36:14,450 antage at det eksisterede ikke sidst. 581 00:36:14,450 --> 00:36:16,390 Du så det pause for lidt selv. 582 00:36:16,390 --> 00:36:22,040 Så hvorfor har jeg miste kontrollen over programmet på dette punkt? 583 00:36:22,040 --> 00:36:27,540 Tja, når jeg skriver næste, der går til den bogstavelige næste linje kode, 584 00:36:27,540 --> 00:36:28,850 vil udføre. 585 00:36:28,850 --> 00:36:35,950 Så efter linie 21, den næste linje kode der skal udføre er linie 22, 586 00:36:35,950 --> 00:36:38,520 der er, spændende fra vigtigste. 587 00:36:38,520 --> 00:36:43,810 Så jeg vil ikke bare gå til den næste linje kode. 588 00:36:43,810 --> 00:36:48,170 Jeg ønsker at gå ind i den funktion, foo, og derefter også gå gennem 589 00:36:48,170 --> 00:36:49,830 disse linjer kode. 590 00:36:49,830 --> 00:36:53,726 >> Så for at vi har et alternativ. 591 00:36:53,726 --> 00:36:56,770 Lad os afslutte det igen. 592 00:36:56,770 --> 00:36:58,020 Break main. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, næste, næste, 13, næste, næste dernæst forsigtigt 595 00:37:06,370 --> 00:37:09,820 før vi ramt linie foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> Så nu er vi på linje 21, hvor vi kalder foo. 598 00:37:13,700 --> 00:37:17,100 Vi ønsker ikke at skrive næste, da det vil bare kalde funktionen foo, og 599 00:37:17,100 --> 00:37:18,710 gå til næste linje kode. 600 00:37:18,710 --> 00:37:20,840 Hvad vi ønsker at bruge, er Step. 601 00:37:20,840 --> 00:37:25,690 Så der er en forskel mellem trin og Next, hvor Step træder ind i 602 00:37:25,690 --> 00:37:28,190 fungere, og Next går over funktionen. 603 00:37:28,190 --> 00:37:32,830 Det bare udfører helhed funktionen og holder vil. 604 00:37:32,830 --> 00:37:37,210 >> Så Step kommer til at bringe os ind i den funktion, foo. 605 00:37:37,210 --> 00:37:41,160 Og vi ser her, nu er vi tilbage på dette, mens løkke, der er i teorien 606 00:37:41,160 --> 00:37:44,190 vil fortsætte for evigt. 607 00:37:44,190 --> 00:37:50,420 Og hvis du rammer Step, når det ikke engang en funktion til at kalde, så er det 608 00:37:50,420 --> 00:37:51,720 identisk med Næste. 609 00:37:51,720 --> 00:37:55,320 Så det er kun, når du er på en linje, kalder en funktion, Trin 610 00:37:55,320 --> 00:37:56,970 kommer til at afvige fra Next. 611 00:37:56,970 --> 00:37:57,930 Så Step vil bringe os her. 612 00:37:57,930 --> 00:38:02,100 Step, step, step, step, step, step, og vi bare uendelig løkke evigt. 613 00:38:02,100 --> 00:38:06,810 >> Så du måske vænne sig til det som din måde at identificere uendelige løkker, er 614 00:38:06,810 --> 00:38:08,960 bare holde dette tasten Enter for at se, hvor du går i stå. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Der er bedre måder at gøre det, men for nu, det er helt tilstrækkeligt. 617 00:38:14,780 --> 00:38:17,967 Og stilistisk, at opfylde Style 50, jeg skulle have gjort dette. 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 sidste kommando at indføre. 621 00:38:28,400 --> 00:38:30,810 Nå, lad os gdb debug i. 622 00:38:30,810 --> 00:38:35,580 Så i stedet for at bryde ved main, hvis jeg kender foo funktion er også den 623 00:38:35,580 --> 00:38:39,230 problem, så kunne jeg lige har sagde, pause på foo stedet. 624 00:38:39,230 --> 00:38:42,310 Lad os sige, jeg bryder på både hoved-og foo. 625 00:38:42,310 --> 00:38:45,390 Så du kan sætte lige så mange breakpoints som du ønsker. 626 00:38:45,390 --> 00:38:49,230 Når jeg skriver køre, går det at stoppe ved - 627 00:38:49,230 --> 00:38:52,180 ooh, lad os rekompilere, eftersom Jeg ændret tingene. 628 00:38:52,180 --> 00:38:55,950 Du vil se denne linje, Advarsel kilde filen er nyere end eksekverbare. 629 00:38:55,950 --> 00:38:59,680 Så det betyder, at jeg bare gik i her og ændret disse i overensstemmelse med stil 630 00:38:59,680 --> 00:39:03,100 50, men jeg havde ikke genkompilere programmet. 631 00:39:03,100 --> 00:39:04,870 Så GDB gør mig opmærksom på dette. 632 00:39:04,870 --> 00:39:10,130 Jeg vil holde op, gør debug igen, hit gdb debug. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> Så nu tilbage til det, jeg lavede. 635 00:39:12,800 --> 00:39:15,720 Break main, bryde foo. 636 00:39:15,720 --> 00:39:20,680 Nu, hvis jeg kører programmet, så det er vil fortsætte indtil rammer en 637 00:39:20,680 --> 00:39:21,320 breakpoint. 638 00:39:21,320 --> 00:39:24,680 At breakpoint sker være den første til main. 639 00:39:24,680 --> 00:39:28,630 Nu, i stedet for at gøre næste, næste, næste, næste, næste, indtil jeg ramte foo, jeg 640 00:39:28,630 --> 00:39:35,230 kan skrive fortsætte, hvilket vil fortsætte indtil du trykker på næste breakpoint. 641 00:39:35,230 --> 00:39:37,200 Jeg er nødt til at indtaste heltal først. 642 00:39:37,200 --> 00:39:40,570 Fortsæt vil fortsætte, indtil jeg ramte næste breakpoint, nemlig at 643 00:39:40,570 --> 00:39:43,320 funktion af foo. 644 00:39:43,320 --> 00:39:50,130 >> Så Run kører indtil du rammer en breakpoint, men du kun skriver kører, når 645 00:39:50,130 --> 00:39:54,060 du starter programmet og derefter fra da af er det fortsætte. 646 00:39:54,060 --> 00:40:01,950 Hvis jeg vidste bare bryde hoved-og derefter løb, vil det bryde på 647 00:40:01,950 --> 00:40:03,670 main, og derefter fortsætte. 648 00:40:03,670 --> 00:40:10,050 Da jeg ikke har en pause punkt foo, indtaste heltal, så nu er jeg 649 00:40:10,050 --> 00:40:11,380 ikke kommer til at knække ved foo. 650 00:40:11,380 --> 00:40:16,318 Det er bare at uendelig løkke, indtil 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 er Intro til GDB. 654 00:40:24,420 --> 00:40:27,790 Du bør begynde at bruge det i dit problem sæt. 655 00:40:27,790 --> 00:40:30,550 Det kan være meget nyttigt at identificere fejl. 656 00:40:30,550 --> 00:40:35,280 Hvis du rent faktisk bare, linje for linje, gå gennem din kode, og sammenligne, hvad er 657 00:40:35,280 --> 00:40:39,740 faktisk sker med hvad du forventer til at ske, så er det temmelig 658 00:40:39,740 --> 00:40:41,060 svært at gå glip af dine fejl. 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å i sidste uge David bragt op på denne hemmelige nøgle-kryptering stuff til 663 00:40:54,040 --> 00:40:59,350 første gang, hvor vi ikke ønsker passwords bare gemmes på vores 664 00:40:59,350 --> 00:41:03,210 computer i nogle almindelig tekstfil, hvor nogen kan komme over og bare 665 00:41:03,210 --> 00:41:04,660 åbne det op og læse dem. 666 00:41:04,660 --> 00:41:07,530 Ideelt set, ville de være krypteret på anden måde. 667 00:41:07,530 --> 00:41:13,340 Og i Problem Set 2, vil du blive beskæftiger sig med én metode til kryptering, 668 00:41:13,340 --> 00:41:16,520 eller, ja, to metoder, men de er ikke så stor. 669 00:41:16,520 --> 00:41:20,050 Hvis du gør hackeren udgave, er du også kommer til at beskæftige sig med 670 00:41:20,050 --> 00:41:22,150 dekryptere nogle ting. 671 00:41:22,150 --> 00:41:29,770 >> Så spørgsmålet er nu, ja, selv om vi har den stærkeste kryptering 672 00:41:29,770 --> 00:41:34,830 algoritme i verden, hvis du vælger en specielt dårlig password, så er det 673 00:41:34,830 --> 00:41:37,720 vil ikke hjælpe dig meget, da folk vil stadig være i stand til at regne det ud. 674 00:41:37,720 --> 00:41:41,530 Selvom se krypterede streng og det ligner en rod af skrald 675 00:41:41,530 --> 00:41:44,760 det betyder intet for dem, hvis de stadig bare nødt til at prøve et par passwords 676 00:41:44,760 --> 00:41:50,560 at regne det ud, så du ikke meget sikker. 677 00:41:50,560 --> 00:41:55,890 Så ser video, der gør dette punkt. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [VIDEOAFSPILNING] 680 00:42:00,970 --> 00:42:02,100 >> -Hjelm, du djævel. 681 00:42:02,100 --> 00:42:03,370 Hvad sker der? 682 00:42:03,370 --> 00:42:05,170 Hvad laver du med min datter? 683 00:42:05,170 --> 00:42:09,910 >> -Tillad mig at introducere den geniale ung plastikkirurg, Dr. Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin den største næse job mand i hele 685 00:42:13,730 --> 00:42:16,080 universet, og Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Deres Højhed. 687 00:42:17,210 --> 00:42:18,070 >> -Næse job? 688 00:42:18,070 --> 00:42:18,670 Jeg forstår det ikke. 689 00:42:18,670 --> 00:42:20,090 Hun har allerede haft en næse job. 690 00:42:20,090 --> 00:42:21,910 Det var en sød seksten stede. 691 00:42:21,910 --> 00:42:22,140 >> -Nr. 692 00:42:22,140 --> 00:42:23,690 Det er ikke hvad du tror. 693 00:42:23,690 --> 00:42:25,420 Det er meget, meget værre. 694 00:42:25,420 --> 00:42:30,300 Hvis du ikke giver mig kombinationen til luftskjoldet Dr. Schlotkin vil 695 00:42:30,300 --> 00:42:34,226 give din datter tilbage sit gamle næse. 696 00:42:34,226 --> 00:42:35,476 >> -Nr. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 Hvor fik du den? 699 00:42:40,516 --> 00:42:41,440 >> -Okay. 700 00:42:41,440 --> 00:42:42,180 Jeg vil fortælle. 701 00:42:42,180 --> 00:42:43,381 Jeg vil fortælle. 702 00:42:43,381 --> 00:42:44,263 Nej, far. 703 00:42:44,263 --> 00:42:45,590 Nej, du skal ikke. 704 00:42:45,590 --> 00:42:46,860 >> -Du er ret, min kære. 705 00:42:46,860 --> 00:42:48,450 Jeg vil savne din nye næse. 706 00:42:48,450 --> 00:42:52,090 Men jeg vil ikke fortælle ham kombinationen, uanset hvad. 707 00:42:52,090 --> 00:42:53,680 >> -Meget godt. 708 00:42:53,680 --> 00:42:55,685 Dr. Schlotkin, gør dit værste. 709 00:42:55,685 --> 00:42:56,914 >> -Min fornøjelse. 710 00:42:56,914 --> 00:43:00,690 >> [TOOLS skærpes] 711 00:43:00,690 --> 00:43:01,910 >> -Nr. 712 00:43:01,910 --> 00:43:02,520 Vent. 713 00:43:02,520 --> 00:43:03,836 Vent. 714 00:43:03,836 --> 00:43:05,300 Jeg vil fortælle. 715 00:43:05,300 --> 00:43:06,880 Jeg vil fortælle. 716 00:43:06,880 --> 00:43:09,130 >> -Jeg vidste, at det ville fungere. 717 00:43:09,130 --> 00:43:09,900 Ok. 718 00:43:09,900 --> 00:43:12,850 Giv den til mig. 719 00:43:12,850 --> 00:43:16,918 >> -Kombinationen er én. 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 >> -Two. 723 00:43:19,358 --> 00:43:19,846 >> -Two. 724 00:43:19,846 --> 00:43:20,822 >> -Two. 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 >> -Four. 729 00:43:23,262 --> 00:43:23,750 >> -Four. 730 00:43:23,750 --> 00:43:26,150 >> -Four. 731 00:43:26,150 --> 00:43:27,010 >> -Five. 732 00:43:27,010 --> 00:43:27,670 >> -Five. 733 00:43:27,670 --> 00:43:29,010 >> -Five. 734 00:43:29,010 --> 00:43:34,770 >> -Så en kombination er én, to, tre, fire, fem. 735 00:43:34,770 --> 00:43:37,460 Det er det dummeste kombination Jeg nogensinde har hørt i mit liv. 736 00:43:37,460 --> 00:43:39,710 Det er den slags ting, en idiot ville have på hans bagage. 737 00:43:39,710 --> 00:43:42,000 >> -Tak, Deres Højhed. 738 00:43:42,000 --> 00:43:43,530 >> -Hvad gjorde du? 739 00:43:43,530 --> 00:43:44,490 >> -Jeg slukkede for væggen. 740 00:43:44,490 --> 00:43:45,420 >> -Nej, du ikke gjorde. 741 00:43:45,420 --> 00:43:45,840 Du slukkede hele filmen. 742 00:43:45,840 --> 00:43:46,930 >> -Jeg må have trykket på den forkerte knap. 743 00:43:46,930 --> 00:43:48,265 >> -Nå, sætte det på igen. 744 00:43:48,265 --> 00:43:49,110 Sæt 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 >> -Lad os gå, Arnold. 748 00:43:50,324 --> 00:43:51,140 Kom, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Selvfølgelig, du ved, jeg vil stadig nødt til at fakturere dig for dette. 750 00:43:53,060 --> 00:43:53,440 >> [END VIDEOAFSPILNING] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: Okay. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Så nu, at vi allerede taler om sikkerhed på nogle måder, nice 754 00:44:08,430 --> 00:44:16,050 lille film plakat, så i de seneste dage, disse spørgsmål med NSA 755 00:44:16,050 --> 00:44:17,300 overvågning alt. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Det kan være svært at føle, at du har en form for privatlivets fred i den 758 00:44:26,930 --> 00:44:34,540 online-verden, selv om jeg ikke kunne fortælle du de fleste af detaljerne i PRISM. 759 00:44:34,540 --> 00:44:42,130 Så bevæger sig over prisme, vi kommer ikke til at være tale om, at nu 760 00:44:42,130 --> 00:44:44,030 tænke på din bærbare computer. 761 00:44:44,030 --> 00:44:48,360 Så op her, jeg ønsker at skifte til mit egentlige konto, 762 00:44:48,360 --> 00:44:50,370 med min lille pingvin. 763 00:44:50,370 --> 00:44:57,310 Så jeg har sat et password, og at password er hvad jeg ønsker, det skal være. 764 00:44:57,310 --> 00:45:02,430 >> Men husk, at hvad jeg logge i med, så dette login 765 00:45:02,430 --> 00:45:04,850 hurtig, er nogle program. 766 00:45:04,850 --> 00:45:07,910 Det er nogle program, der var skrevet af nogle person. 767 00:45:07,910 --> 00:45:13,250 Og ja, denne person, hvis de er særligt ondsindede, de kunne 768 00:45:13,250 --> 00:45:17,780 har sagt, okay, så hvis adgangskoden at jeg indtaster er lig med min 769 00:45:17,780 --> 00:45:22,800 faktiske adgangskode, eller det er lig til nogle særlige adgangskode - 770 00:45:22,800 --> 00:45:25,550 David er awesome eller noget - 771 00:45:25,550 --> 00:45:27,190 så lad dem i. 772 00:45:27,190 --> 00:45:33,760 Så en ondsindet programmør kunne have adgang til alle dine Mac-computere, eller 773 00:45:33,760 --> 00:45:36,150 Vinduer, eller noget. 774 00:45:36,150 --> 00:45:41,980 >> Så det er ikke meget af en bekymring, da der Jeg mener, det er login program 775 00:45:41,980 --> 00:45:48,720 der er leveret med OS X, hundreder eller tusindvis af mennesker har 776 00:45:48,720 --> 00:45:50,020 revideret denne kode. 777 00:45:50,020 --> 00:45:55,330 Og så, hvis, i din kode eller andet sted, du sige, hvis denne streng lig ligemænd 778 00:45:55,330 --> 00:45:58,860 David er awesome, login, så nogen er kommer til at være, ligesom, vent. 779 00:45:58,860 --> 00:45:59,800 Det er ikke rigtigt. 780 00:45:59,800 --> 00:46:01,790 Dette bør ikke være her. 781 00:46:01,790 --> 00:46:06,650 Så det er en måde, vi får tingene at være slags sikker. 782 00:46:06,650 --> 00:46:10,300 >> Men tænk over endda programmer som du skriver. 783 00:46:10,300 --> 00:46:13,000 Lad os sige, du skrev login-programmet. 784 00:46:13,000 --> 00:46:20,440 Så dette login program, du skrev, så selvfølgelig, du er en god 785 00:46:20,440 --> 00:46:21,210 programmør. 786 00:46:21,210 --> 00:46:25,610 Du kommer ikke til at sætte nogen skadelig hvis x er lig lig David er awesome 787 00:46:25,610 --> 00:46:27,860 ind i din kode. 788 00:46:27,860 --> 00:46:31,930 Men dette program, hvad gør du bruge til at kompilere dette program? 789 00:46:31,930 --> 00:46:34,180 Noget lignende Dunk. 790 00:46:34,180 --> 00:46:38,460 Så hvad hvis den person, som tilfældigvis skrive Clang særlig hylstre i Clang 791 00:46:38,460 --> 00:46:44,310 noget lignende, hvis jeg samle den login program, og indtast derefter koden 792 00:46:44,310 --> 00:46:49,720 ind i login-program, der siger, hvis x lig lig David er awesome? 793 00:46:49,720 --> 00:46:59,890 Så ikke helt endnu, men vi har det samme problem her, hvor Dunk, ja, 794 00:46:59,890 --> 00:47:03,790 tusinder, hvis ikke titusinder af mennesker, har kigget på Dunk, har 795 00:47:03,790 --> 00:47:07,160 kiggede på sine linjer kode og sagde, okay, der er ikke noget dårligt her. 796 00:47:07,160 --> 00:47:10,680 Naturligvis er der ingen gør noget denne ondsindede. 797 00:47:10,680 --> 00:47:15,780 >> Men hvad der er klang i sig selv, ligesom, hvad hvis jeg kompilere Dunk? 798 00:47:15,780 --> 00:47:20,900 Hvad hvis jeg har nogle compiler, kompilerer Dunk, som indsætter i Clang 799 00:47:20,900 --> 00:47:25,610 denne særlige hack, der siger, okay, når jeg kompilere Dunk, så 800 00:47:25,610 --> 00:47:31,290 eksekverbar Jeg får bør specielt se indersiden af ​​login-program og Indsæt 801 00:47:31,290 --> 00:47:34,230 denne adgangskode, er lig med ligemænd Dave er awesome? 802 00:47:34,230 --> 00:47:37,990 Så husk, at din compiler selv skal udarbejdes på et tidspunkt. 803 00:47:37,990 --> 00:47:42,810 Så hvis det, du vælger at kompilere Clang med, er i sig selv skadeligt, så du 804 00:47:42,810 --> 00:47:45,580 kunne skrues hele vejen ned linjen. 805 00:47:45,580 --> 00:47:49,630 >> Så her har vi Ken Thompson og Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 Så dette er et ikonisk foto. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie er til højre. 808 00:47:55,470 --> 00:47:58,740 Han er en stor - 809 00:47:58,740 --> 00:48:03,640 temmelig meget skrev C. Så du kan takke ham for denne klasse. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson er til venstre. 811 00:48:04,840 --> 00:48:07,780 De to af dem dybest set skrev UNIX. 812 00:48:07,780 --> 00:48:10,140 Nå, var de største bidragydere i UNIX. 813 00:48:10,140 --> 00:48:11,310 Der var nogle andre. 814 00:48:11,310 --> 00:48:16,240 Så Ken Thompson, på et tidspunkt, Han vinder Turing Award. 815 00:48:16,240 --> 00:48:20,860 Og Turingprisen, har jeg altid hørt Det refereres på denne måde, er det den 816 00:48:20,860 --> 00:48:23,100 Nobelpris datalogi. 817 00:48:23,100 --> 00:48:27,500 >> Så i Turing Award, han har til at give sin takketale. 818 00:48:27,500 --> 00:48:31,790 Og han giver denne meget berømte tale nu kaldet Overvejelser om Trusting 819 00:48:31,790 --> 00:48:35,620 Trust, som vi har knyttet til på kursets hjemmeside. 820 00:48:35,620 --> 00:48:41,670 Og i denne tale, siger han, okay, så jeg skrev UNIX, og nu alle 821 00:48:41,670 --> 00:48:43,320 du folk bruger UNIX. 822 00:48:43,320 --> 00:48:46,960 Husk nu, i dag, at Linux er en direkte efterkommer af UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X direkte bruger UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows gør ikke så meget, men en masse af ideer blev taget fra UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Så han går op på scenen og siger, okay, jeg skrev UNIX. 826 00:48:59,220 --> 00:49:03,940 Og bare så du fyre ved, jeg er stand til at logge ind i hver 827 00:49:03,940 --> 00:49:05,590 eneste af dine computere. 828 00:49:05,590 --> 00:49:14,280 Da jeg sætter en af ​​disse særlige, hvis x lig lig Ken Thomson er awesome, 829 00:49:14,280 --> 00:49:16,350 så jeg får lov til at logge ind. 830 00:49:16,350 --> 00:49:18,370 Så folk er ligesom, ja, Hvordan har du det? 831 00:49:18,370 --> 00:49:21,090 Vi kiggede på login-programmet og intet er der. 832 00:49:21,090 --> 00:49:24,700 Han er ligesom, ja, jeg ændrede compiler at logge ind på login-program 833 00:49:24,700 --> 00:49:30,490 så login-programmet nu vil have at x er lig med lig Ken Thompson 834 00:49:30,490 --> 00:49:31,700 er awesome. 835 00:49:31,700 --> 00:49:33,120 >> Og de siger, ja, det er ikke sandt. 836 00:49:33,120 --> 00:49:35,740 Vi kigger på compiler, og compiler ikke har nogen linjer 837 00:49:35,740 --> 00:49:36,400 kode som. 838 00:49:36,400 --> 00:49:40,540 Han er ligesom, OK, men hvad er du udarbejdelsen af ​​compiler med? 839 00:49:40,540 --> 00:49:44,810 Og de tænker, og han er ligesom, ja, Jeg er den ene, der gav dig compileren 840 00:49:44,810 --> 00:49:50,580 du bruger til at kompilere compiler, så du kompilere en compiler, der 841 00:49:50,580 --> 00:49:56,390 selv er ondskabsfuld og vil bryde login programmet. 842 00:49:56,390 --> 00:49:59,360 Så dybest set, på det tidspunkt, der er ingen måde du kunne se på kilden 843 00:49:59,360 --> 00:50:02,450 kode af login-programmet at se, hvad der er galt. 844 00:50:02,450 --> 00:50:04,220 Du kunne ikke engang kigge i kildekode compiler 845 00:50:04,220 --> 00:50:06,790 at se, hvad der er galt. 846 00:50:06,790 --> 00:50:11,940 >> Du vil skulle se på maskinen , der faktisk binære af 847 00:50:11,940 --> 00:50:16,760 kompileret compiler til at se, vent, disse linjer kode bør ikke være her. 848 00:50:16,760 --> 00:50:22,130 Men Ken Thompson tog det et skridt videre og sagde, ja, der er 849 00:50:22,130 --> 00:50:25,980 disse særlige programmer, der faktisk hjælpe dig med at læse den binære af programmer, 850 00:50:25,980 --> 00:50:29,340 og så hvis en person har brugt dette program til læse den binære, ville de se disse 851 00:50:29,340 --> 00:50:30,490 linjer kode. 852 00:50:30,490 --> 00:50:34,020 Han ændrede disse programmer til at sige, alle højre, hvis du søger på det 853 00:50:34,020 --> 00:50:38,460 compiler, vis ikke denne særlige sæt af binære. 854 00:50:38,460 --> 00:50:42,830 >> Så er du nødt til at tage det et skridt videre og dybest set, der kunne have 855 00:50:42,830 --> 00:50:46,210 taget flere niveauer af indirektion, og på et tidspunkt, ingen er faktisk 856 00:50:46,210 --> 00:50:47,990 kommer til at være kontrol. 857 00:50:47,990 --> 00:50:52,590 Så den moralske af historien er, at du er ikke kommer til at skrive 858 00:50:52,590 --> 00:50:54,340 Klang i denne klasse. 859 00:50:54,340 --> 00:50:57,020 Du skal bruge klatring Klang en masse i denne klasse. 860 00:50:57,020 --> 00:51:00,490 For alle du kender, Dunk er en ondsindet program, der saboterer hver 861 00:51:00,490 --> 00:51:03,520 enkelt program, du nogensinde har kompileret. 862 00:51:03,520 --> 00:51:08,206 Og for at forlade dig på det meget ildevarslende Bemærk, se dig på onsdag. 863 00:51:08,206 --> 00:51:10,030 >> [Applaus] 864 00:51:10,030 --> 00:51:12,935 >> SPEAKER 2: På det næste CS50. 865 00:51:12,935 --> 00:51:14,580 >> SPEAKER 3: Kan du ikke tør sige det. 866 00:51:14,580 --> 00:51:15,930 Du kan gøre dette. 867 00:51:15,930 --> 00:51:19,440 Du har gjort det før, kan du gøre dette i dag, kan du gøre det i morgen. 868 00:51:19,440 --> 00:51:20,930 Du har gjort det i årevis. 869 00:51:20,930 --> 00:51:22,790 Bare gå derop og gøre dette. 870 00:51:22,790 --> 00:51:24,310 Du kan gøre dette. 871 00:51:24,310 --> 00:51:26,102 >> [Musikgengivelse]