1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [Musikk spilles] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: Greit. 4 00:00:12,100 --> 00:00:15,620 Så, første først, av video fra et kjent ansikt. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [VIDEOAVSPILLING] 7 00:00:22,560 --> 00:00:23,370 >> -Greit. 8 00:00:23,370 --> 00:00:27,150 Dette er CS50, og dette er begynnelsen av uke tre. 9 00:00:27,150 --> 00:00:29,980 Jeg beklager at jeg ikke kunne være der med deg i dag, men la meg få presentere 10 00:00:29,980 --> 00:00:32,880 CS50 egen Rob Boden. 11 00:00:32,880 --> 00:00:33,872 >> [END VIDEOAVSPILLING] 12 00:00:33,872 --> 00:00:39,340 >> [Applaus og SKÅL] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: The 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å først, det er en annen lunsj. 17 00:00:50,960 --> 00:00:52,330 Det er i morgen kl 01:15. 18 00:00:52,330 --> 00:00:54,480 Det er ingen lunsj dette 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 her ennå, men en av menneskene 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 morsom fyr. 23 00:01:02,730 --> 00:01:04,819 Du bør komme. 24 00:01:04,819 --> 00:01:05,900 >> OK. 25 00:01:05,900 --> 00:01:11,360 Så forrige uke, begynte vi å bryte fra hverandre om hva en streng egentlig er. 26 00:01:11,360 --> 00:01:14,830 Vi har kjent siden begynnelsen at det er en sekvens av tegn. 27 00:01:14,830 --> 00:01:18,130 Men i forrige uke, dykket vi i det faktum at det som virkelig er en sekvens av 28 00:01:18,130 --> 00:01:22,110 tegn, vel, vi har nå matriser av tegn. 29 00:01:22,110 --> 00:01:26,450 Og vi vet at en streng, er det en rekke tegn, helt på slutten, 30 00:01:26,450 --> 00:01:30,920 vi har denne spesielle null byte, dette backslash 0, indikerer at slutten av 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 rekke tegn, men vi kan ha mer enn 33 00:01:36,970 --> 00:01:39,530 bare en rekke tegn, vi kan ha et utvalg av hvilken som helst 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 forrige uke, Ages program som David innført 36 00:01:51,570 --> 00:01:53,560 veldig raskt. 37 00:01:53,560 --> 00:01:57,010 Så det første vi skal gjøre er spør brukeren om et heltall, den 38 00:01:57,010 --> 00:01:58,800 antall personer i rommet. 39 00:01:58,800 --> 00:02:01,260 Når vi har som heltall, vi erklære en matrise. 40 00:02:01,260 --> 00:02:02,890 Legg merke til denne braketten syntaks. 41 00:02:02,890 --> 00:02:04,540 Du kommer til å bli vant til det. 42 00:02:04,540 --> 00:02:09,430 >> Så vi erklære en matrise av heltall kalt aldre, og det er n 43 00:02:09,430 --> 00:02:12,080 heltall i denne matrisen. 44 00:02:12,080 --> 00:02:16,480 Så dette mønsteret her, dette fire int i er lik 0, i er mindre enn n, i plus 45 00:02:16,480 --> 00:02:20,580 pluss, som også kommer til å være et mønster at du blir veldig vant til. 46 00:02:20,580 --> 00:02:24,000 Fordi det er ganske mye hvor du er alltid kommer til å iterere over arrays. 47 00:02:24,000 --> 00:02:26,330 Så huske at n er lengden på array. 48 00:02:26,330 --> 00:02:32,120 Og så her er vi gjentatte ganger spør for en alder av personen jeg i rommet. 49 00:02:32,120 --> 00:02:36,640 >> Etter dette, går vi ned, og uansett vilkårlig grunn, vi så 50 00:02:36,640 --> 00:02:40,220 skrive ut hvor gamle de kommer å være et år fra nå. 51 00:02:40,220 --> 00:02:49,980 Og kjører det programmet, la oss gjøre aldre, dot slash aldre. 52 00:02:49,980 --> 00:02:53,010 Så antall personer i rommet, la oss si at det er tre. 53 00:02:53,010 --> 00:02:59,880 Og si, den første personen er 13, neste er 26, og den siste er 30 år. 54 00:02:59,880 --> 00:03:05,080 Så da vil det iterere over de tre folk, skrive ut 14, 27, og 31.. 55 00:03:05,080 --> 00:03:16,060 >> Så husk at når vi erklære en utvalg av størrelse n, indeksene i at 56 00:03:16,060 --> 00:03:19,950 matrise, har matrisen verdier og indeksene 0, 1, 2, hele veien 57 00:03:19,950 --> 00:03:21,680 opp til n minus en. 58 00:03:21,680 --> 00:03:26,255 Så når vi sa det var tre personer i rommet, og vi satt i her 59 00:03:26,255 --> 00:03:29,850 den første iterasjon gjennom dette loop, er jeg kommer til å være 0. 60 00:03:29,850 --> 00:03:31,650 Så i indeksen 0. 61 00:03:31,650 --> 00:03:34,540 Vi tildeler den første alder brukeren angir. 62 00:03:34,540 --> 00:03:38,870 Så i den neste, vi går inn i andre n brukeren angir, og i 63 00:03:38,870 --> 00:03:40,580 ved to, den siste n. 64 00:03:40,580 --> 00:03:44,200 >> Så merker at en rekke av størrelse tre har ikke noe 65 00:03:44,200 --> 00:03:46,040 i indeksen tre. 66 00:03:46,040 --> 00:03:49,036 Dette er ikke gyldig. 67 00:03:49,036 --> 00:03:50,250 OK. 68 00:03:50,250 --> 00:03:55,136 Så, gå tilbake hit. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Så nå som vi har jobbet med matriser, vi har noen kjennskap. 71 00:04:01,590 --> 00:04:03,780 Nå kommer vi til å flytte på kommando for å argumenter, som kommer til å være 72 00:04:03,780 --> 00:04:05,890 ganske relevant for dette problemet settet. 73 00:04:05,890 --> 00:04:09,670 >> Så frem til nå, når du har erklærte din viktigste funksjon, vi har 74 00:04:09,670 --> 00:04:11,230 sa int main ugyldig. 75 00:04:11,230 --> 00:04:14,070 Så void betyr bare at vi er ikke passerer noen 76 00:04:14,070 --> 00:04:16,440 argumenter til denne funksjonen. 77 00:04:16,440 --> 00:04:19,190 Nå kommer vi til å se at hoved kan ta noen argumenter. 78 00:04:19,190 --> 00:04:22,470 Her kaller vi dem int argc og streng argv parentes. 79 00:04:22,470 --> 00:04:26,930 Brakettene, nok en gang, noe som indikerer at vi har å gjøre med matriser. 80 00:04:26,930 --> 00:04:31,850 Så her, streng argv parentes, er vi arbeider med en rekke strenger. 81 00:04:31,850 --> 00:04:35,360 Så argc, som kommer til å indikere hvor mange argumenter vi har 82 00:04:35,360 --> 00:04:37,580 gått til dette programmet. 83 00:04:37,580 --> 00:04:46,050 Og for å se hva det betyr, La oss lukke dette. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Så frem til nå, har vi kjørt hver program som dot slash aldre. 86 00:04:50,790 --> 00:04:55,250 Vi kan også, på kommandolinjen, forbi passere argumenter, og dermed begrepet, kommando 87 00:04:55,250 --> 00:04:56,550 argumentene. 88 00:04:56,550 --> 00:04:59,760 Så det første argumentet, hello world. 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 greven av argumentene på kommandolinjen. 91 00:05:07,720 --> 00:05:12,840 Argc er alltid minst en, siden dot slash aldre, selv, teller som ett av 92 00:05:12,840 --> 00:05:14,490 kommandolinjeargumentene. 93 00:05:14,490 --> 00:05:17,010 >> Så hei er det første. 94 00:05:17,010 --> 00:05:20,460 Hvis dot slash aldre er zeroth, deretter hei er den første, og verden er 95 00:05:20,460 --> 00:05:22,830 andre kommandolinje argument. 96 00:05:22,830 --> 00:05:29,490 Så strengen argv, kommer vi til å se, inneholder strenger, dot slash 97 00:05:29,490 --> 00:05:33,830 aldre, hallo, og verden. 98 00:05:33,830 --> 00:05:38,945 Og, av David anmodning, skal vi å spille en video innføre det. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [VIDEOAVSPILLING] 101 00:05:43,890 --> 00:05:46,240 >> -Frem til nå i programmene vi ve skrevet, har vi erklære 102 00:05:46,240 --> 00:05:48,500 Hoved som int main ugyldig. 103 00:05:48,500 --> 00:05:51,170 Og hele denne tiden, har det tomrommet rett og slett vært å spesifisere at 104 00:05:51,170 --> 00:05:54,430 Programmet tar ikke noe kommandolinjeargumentene. 105 00:05:54,430 --> 00:05:57,750 Med andre ord, når en bruker kjører en program, kan han eller hun gi kommandoen 106 00:05:57,750 --> 00:06:01,710 argumenter ved å skrive tilleggs ord eller setninger etter programmets 107 00:06:01,710 --> 00:06:03,000 navn i ledeteksten. 108 00:06:03,000 --> 00:06:06,550 >> Vel, hvis du tror du vil at programmet skal ta kommandolinje argumenter, ett eller 109 00:06:06,550 --> 00:06:10,540 flere slike ord, må vi erstatte ugyldig med et par argumenter. 110 00:06:10,540 --> 00:06:12,200 Så la oss gjøre det. 111 00:06:12,200 --> 00:06:15,750 Inkluder CS50.h. 112 00:06:15,750 --> 00:06:19,360 Inkluder standard io.h. 113 00:06:19,360 --> 00:06:20,760 Int main. 114 00:06:20,760 --> 00:06:26,330 Og nå, i stedet for ugyldig, jeg kommer til å spesifisere en int kalt argc, og en 115 00:06:26,330 --> 00:06:28,780 tabell med strenger som kalles argv. 116 00:06:28,780 --> 00:06:31,820 Nå argc og argv er bare konvensjoner. 117 00:06:31,820 --> 00:06:34,000 >> Vi kunne ha kalt disse argumentene de fleste noe vi ønsker. 118 00:06:34,000 --> 00:06:37,630 Men det som er viktig er at argc er en int fordi, per definisjon, er det 119 00:06:37,630 --> 00:06:41,360 kommer til å inneholde argumentet teller, den antall ord i total at 120 00:06:41,360 --> 00:06:43,380 brukeren har skrevet inn på hans eller hennes spørsmål. 121 00:06:43,380 --> 00:06:47,910 argv, i mellomtiden, argument vektor, er kommer til å faktisk være en matrise lagring 122 00:06:47,910 --> 00:06:52,020 alle ordene som brukeren har skrevet på hans eller hennes spørsmål. 123 00:06:52,020 --> 00:06:54,500 >> La oss fortsette å gjøre noe nå med en eller flere av disse 124 00:06:54,500 --> 00:06:55,660 kommandolinjeargumentene. 125 00:06:55,660 --> 00:07:00,070 Spesielt la oss gå videre og print hva ordet brukeren taster 126 00:07:00,070 --> 00:07:03,960 etter programmets navn ved ledeteksten. 127 00:07:03,960 --> 00:07:04,730 Åpen brakett. 128 00:07:04,730 --> 00:07:06,240 Lukk brakett. 129 00:07:06,240 --> 00:07:10,510 Printf prosent s backslash og komma. 130 00:07:10,510 --> 00:07:14,550 Og nå trenger jeg å fortelle printf hvilken verdi å plugge inn som plassholder. 131 00:07:14,550 --> 00:07:18,600 Jeg vil ha det første ordet som brukeren har skrevet etter programmets navn, 132 00:07:18,600 --> 00:07:23,130 og så kommer jeg til å spesifisere argv brakett 1, tett 133 00:07:23,130 --> 00:07:24,830 parentes, semikolon. 134 00:07:24,830 --> 00:07:27,290 >> Nå, hvorfor brakett 1 og ikke brakett 0? 135 00:07:27,290 --> 00:07:30,990 Vel, det viser seg, automatisk lagret i argv 0 kommer til å være det 136 00:07:30,990 --> 00:07:32,620 Programmet faktiske navn. 137 00:07:32,620 --> 00:07:36,180 Så det første ordet som brukeren skriver etter at programmet heter, etter 138 00:07:36,180 --> 00:07:38,990 konvensjonen, kommer til å være lagres i argv en. 139 00:07:38,990 --> 00:07:42,380 La oss nå samle og kjøre dette programmet. 140 00:07:42,380 --> 00:07:47,780 >> Gjør argv 0, dot slash argv 0. 141 00:07:47,780 --> 00:07:50,520 Og nå et ord som hei. 142 00:07:50,520 --> 00:07:51,670 Enter. 143 00:07:51,670 --> 00:07:53,520 Og der har vi det, hallo. 144 00:07:53,520 --> 00:07:55,750 >> [END VIDEOAVSPILLING] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: Greit. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Lukk det. 148 00:08:01,230 --> 00:08:16,730 Så ta en titt på det programmet som vi nettopp introdusert til oss, vel, bare 149 00:08:16,730 --> 00:08:24,710 å vise, hvis vi skriver ut argv 0, gjøre, nå hva er det, argv 0, dot slash argv 0. 150 00:08:24,710 --> 00:08:30,440 Så, som forventet, er det å skrive ut navnet på programmet, siden argv 0 er 151 00:08:30,440 --> 00:08:32,970 alltid kommer til å være det navnet på programmet. 152 00:08:32,970 --> 00:08:35,640 Men la oss gjøre noe litt mer interessant. 153 00:08:35,640 --> 00:08:42,080 >> Så i problemet sett, vil du være introdusert til denne funksjonen, atoi. 154 00:08:42,080 --> 00:08:44,440 Så hva bruker vi atoi for? 155 00:08:44,440 --> 00:08:48,550 Det kommer til å konvertere en streng til et helt tall. 156 00:08:48,550 --> 00:08:53,280 Så hvis jeg passerer strengen, en to tre, til atoi, som vil konvertere 157 00:08:53,280 --> 00:08:56,910 til heltall, en to tre. 158 00:08:56,910 --> 00:09:01,480 Så vi kommer til å konvertere den første Argumentet for kommandolinjen til et heltall, 159 00:09:01,480 --> 00:09:05,690 og så bare ut som heltall. 160 00:09:05,690 --> 00:09:09,680 >> Så i utgangspunktet, er vi på en måte reimplementing getint, bare 161 00:09:09,680 --> 00:09:12,350 heltall inn 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å da gjør argv 0, la oss gjøre det her inne, og lukke det. 164 00:09:23,170 --> 00:09:27,670 Så kjører argv 0, og la oss gå inn i heltall, en to tre fire én to. 165 00:09:27,670 --> 00:09:30,840 Så det vil skrive ut heltall, ett to tre fire én to. 166 00:09:30,840 --> 00:09:35,500 Det er noen nyanserikdommen til Atoi at det vil slutte å bry seg om noe 167 00:09:35,500 --> 00:09:39,040 utover en gyldig numerisk tegn, men det spiller ingen rolle. 168 00:09:39,040 --> 00:09:42,870 >> Så hva tror du skjer hvis jeg gjør dette? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Segmentering feil. 171 00:09:47,050 --> 00:09:50,410 Så hvorfor er det? 172 00:09:50,410 --> 00:09:56,060 Hvis du ser tilbake på vårt program, er vi konvertering argv 1, det første argumentet 173 00:09:56,060 --> 00:09:59,610 etter programnavnet, til et helt tall. 174 00:09:59,610 --> 00:10:03,350 Men det er ingen argument etter programnavnet. 175 00:10:03,350 --> 00:10:08,060 Så her ser vi at dette er en buggy program, siden, hvis vi prøver å kjøre den 176 00:10:08,060 --> 00:10:10,530 uten argumenter, det vil bare krasje. 177 00:10:10,530 --> 00:10:16,950 >> Så en annen vanlig mønster du vil se er noe sånt, hvis argc er mindre 178 00:10:16,950 --> 00:10:21,100 enn to, noe som indikerer at det ikke var minst navnet program og en 179 00:10:21,100 --> 00:10:29,100 første argument, så får vi gjøre noe som printf, ikke nok 180 00:10:29,100 --> 00:10:31,190 kommandolinjeargumentene. 181 00:10:31,190 --> 00:10:33,170 Det er nok ikke en god en til å skrive ut, det er nok noe, som 182 00:10:33,170 --> 00:10:35,440 du bør legge inn et heltall på kommandolinjen. 183 00:10:35,440 --> 00:10:37,450 Jeg vil bare avslutte den der. 184 00:10:37,450 --> 00:10:39,600 Og så tilbake 1. 185 00:10:39,600 --> 00:10:44,740 Så huske på at ved slutten av vår program, hvis vi går tilbake 0, den slags 186 00:10:44,740 --> 00:10:47,060 indikerer suksess. 187 00:10:47,060 --> 00:10:50,940 Og hoved også automatisk returnerer 0 hvis du ikke gjør det. 188 00:10:50,940 --> 00:10:55,800 >> Så her er vi retuning 1 for å indikere at det er ikke suksess. 189 00:10:55,800 --> 00:11:01,000 Og du kan returnere hva du vil, bare, 0 angir suksess, og 190 00:11:01,000 --> 00:11:03,390 noe annet indikerer svikt. 191 00:11:03,390 --> 00:11:04,855 Så la oss kjøre denne versjonen av ting. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Så nå, hvis vi ikke går inn en kommandolinje argument, vil det riktig fortelle 194 00:11:16,600 --> 00:11:18,290 oss, ikke nok kommandolinje. 195 00:11:18,290 --> 00:11:20,610 Visste ikke fullføre setningen. 196 00:11:20,610 --> 00:11:24,950 Else, hvis vi faktisk passere den ene, det kan fullføre programmet. 197 00:11:24,950 --> 00:11:27,920 Så dette er hvordan du ville bruke argc i For å validere antallet 198 00:11:27,920 --> 00:11:30,630 kommandolinjeargumentene er faktisk passert. 199 00:11:30,630 --> 00:11:39,360 >> Så la oss gjøre dette programmet litt mer komplisert, og se på det andre 200 00:11:39,360 --> 00:11:42,180 gjentakelse av ting. 201 00:11:42,180 --> 00:11:46,310 Så nå, er vi ikke bare skrive ut første kommandolinjeargument. 202 00:11:46,310 --> 00:11:51,210 Her, vi gjentar fra int i equals 0, er jeg mindre enn argc, jeg pluss 203 00:11:51,210 --> 00:11:55,280 pluss, og utskrift argv, indeks jeg. 204 00:11:55,280 --> 00:11:59,300 Så dette mønsteret, igjen, er dette det samme mønster som før, bortsett fra i stedet 205 00:11:59,300 --> 00:12:02,600 å kalle variabelen n, bruker vi argc. 206 00:12:02,600 --> 00:12:09,520 >> Så dette er itera over hver indeks i matrisen, og utskrift hver 207 00:12:09,520 --> 00:12:11,910 element i denne matrisen. 208 00:12:11,910 --> 00:12:20,300 Og så, når vi kjører dette programmet, vel, Jeg har ikke skrevet inn noen kommandolinje 209 00:12:20,300 --> 00:12:22,540 argumenter, så det bare utskrifter programnavnet. 210 00:12:22,540 --> 00:12:26,053 Hvis jeg legger inn en haug med ting, det vil skrive ut é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å la oss ta dette ett skritt videre. 214 00:12:34,770 --> 00:12:38,890 Og i stedet for å skrive ut hvert argument på en egen linje, la oss skrive ut hver 215 00:12:38,890 --> 00:12:42,590 karakter av hvert argument på sin egen linje. 216 00:12:42,590 --> 00:12:46,700 Så husk at argv er en rekke strenger. 217 00:12:46,700 --> 00:12:50,960 Så hva er en streng, men en rekke tegn? 218 00:12:50,960 --> 00:12:57,140 Så det betyr at argv er virkelig en utvalg av en rekke tegn. 219 00:12:57,140 --> 00:13:04,920 Så dra nytte av det, la oss ignorere dette for nå. 220 00:13:04,920 --> 00:13:08,190 La oss bare vurdere strengen argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Så hvis vi ønsker å bringe hver karakter argv 0 på en egen linje, så jeg vil 222 00:13:14,170 --> 00:13:19,500 å gjøre det mønsteret vi er vant til, er jeg mindre enn lengden av rekken, 223 00:13:19,500 --> 00:13:23,990 som her, er strlen av, er at ikke hva jeg vil gjøre, streng 224 00:13:23,990 --> 00:13:26,450 s lik argv 0. 225 00:13:26,450 --> 00:13:30,390 Så i er mindre enn lengden av vår matrise, som i dette tilfelle er en matrise 226 00:13:30,390 --> 00:13:34,410 av tegn, jeg pluss pluss. 227 00:13:34,410 --> 00:13:41,040 Og så, som vi så i forrige uke, er det ideelt hvis vi flytter at strlen utenfor 228 00:13:41,040 --> 00:13:45,210 av tilstanden, vil da n legge den strlen av s hver gang vi går 229 00:13:45,210 --> 00:13:47,720 gjennom løkken, og det er ikke kommer til å være i endring. 230 00:13:47,720 --> 00:13:50,230 Så får vi sette den lik n over her. 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å nå er vi gjentar i løpet hver indeks i matrisen. 234 00:14:01,320 --> 00:14:05,630 Og så, hvis vi ønsker å skrive ut hver karakter i denne matrisen, prosent c er 235 00:14:05,630 --> 00:14:06,880 flagget vi ønsker å bruke for tegn. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 Og nå en brakett jeg kommer til å være den streng, indeks karakter i, slik at hvis den 238 00:14:19,770 --> 00:14:20,970 strengen var hallo. 239 00:14:20,970 --> 00:14:27,530 deretter s 0 kommer til å være h, s brakett 1 vil være e, og så videre. 240 00:14:27,530 --> 00:14:30,800 >> Så nå ønsker vi å kombinere disse to tingene. 241 00:14:30,800 --> 00:14:35,440 Vi ønsker å skrive ut hvert tegn av hver kommandolinje argument. 242 00:14:35,440 --> 00:14:38,950 Så vi kommer til å ha en nestet for loop. 243 00:14:38,950 --> 00:14:47,480 Og konvensjonelt, den første telleren er jeg, den neste kommer til å bli j, n 244 00:14:47,480 --> 00:14:54,450 vil være strlen av argv i, i er mindre enn n, jeg pluss pluss. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 Og nå i stedet for utskrift argv i, så argv brakett jeg kommer til å index - 247 00:15:06,870 --> 00:15:14,280 som kommer til å være den i-te kommandolinje argument, argv i, j kommer til å 248 00:15:14,280 --> 00:15:16,925 være jth karakter i-te argument. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Jeg skal bli kvitt dette opp her nå siden vi sette det inn i den loopen. 251 00:15:24,810 --> 00:15:33,900 Så tilsvarer streng s likemenn argv i, og deretter s brakett j. 252 00:15:33,900 --> 00:15:36,980 >> Vel, trenger vi ikke å erklære denne variabelen s. 253 00:15:36,980 --> 00:15:44,530 I stedet vil vi bare kombinere disse to i hva vi hadde, ARGV i, j. 254 00:15:44,530 --> 00:15:45,780 >> SPEAKER 1: [uhørbart]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: Good call. 257 00:15:49,680 --> 00:15:52,936 Så dette er brukket. 258 00:15:52,936 --> 00:15:55,510 Hvis jeg faktisk kjørte den, ville vi har innsett dette. 259 00:15:55,510 --> 00:16:01,210 Så teller jeg bryr meg om i denne spesielle for 260 00:16:01,210 --> 00:16:05,410 sløyfe er j, iterator. 261 00:16:05,410 --> 00:16:08,560 Så du ville ha kjørt inn i problemer, trolig en uendelig loop, hvis vi 262 00:16:08,560 --> 00:16:09,540 ikke hadde fikset det. 263 00:16:09,540 --> 00:16:12,220 Det er derfor vi også snakker om debugging i dag. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Så la oss kjøre dette programmet. 266 00:16:15,240 --> 00:16:21,200 Og la oss faktisk legge en egen printf akkurat her som vil bare skrive 267 00:16:21,200 --> 00:16:27,480 en annen linje, siden dette betyr at når vi kjøre programmet, vil det være en blank 268 00:16:27,480 --> 00:16:31,830 linjen mellom hvert tegn i hver kommandolinje argument. 269 00:16:31,830 --> 00:16:33,448 Vel, vi får se hva det betyr. 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 Fikk noen bug. 273 00:16:39,870 --> 00:16:42,860 Feil implisitt erklære bibliotekfunksjon strlen. 274 00:16:42,860 --> 00:16:51,630 >> Så kommer tilbake til vårt program, jeg glemte å hasj inkluderer 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 å være den header-fil som erklærer 277 00:16:57,730 --> 00:16:58,980 funksjonen strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, sammenstiller det. 280 00:17:06,060 --> 00:17:09,109 Nå, la oss kjøre den. 281 00:17:09,109 --> 00:17:10,930 Så akkurat det. 282 00:17:10,930 --> 00:17:17,790 Det kommer til å skrive ut våre programnavn, hello world. 283 00:17:17,790 --> 00:17:23,510 Det kommer til å skrive ut 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å la oss faktisk ta dette ett skritt videre. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 Og i stedet for å bruke string.h, la oss tenke på hvordan vi skulle gjennomføre vår egen 288 00:17:39,700 --> 00:17:41,420 strlen funksjon. 289 00:17:41,420 --> 00:17:45,600 Så jeg skal umiddelbart gi en funksjon signatur. 290 00:17:45,600 --> 00:17:52,900 Så la oss kalle i my_strlen, og det er kommer til å ta en streng som argument, 291 00:17:52,900 --> 00:17:57,220 og vi regner med å returnere lengden på strengen. 292 00:17:57,220 --> 00:18:03,430 Så, hvor er den fyren? 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 lysbilde som var også fra forrige uke, som en 296 00:18:12,900 --> 00:18:18,890 rekke tegn, vel, en streng, så la oss si at dette er vår strengen s. 297 00:18:18,890 --> 00:18:29,870 Så hvis s er strengen, hallo, da, H-E-L-L-O, i minnet, som kommer til å 298 00:18:29,870 --> 00:18:35,610 være, og da denne backslash 0 karakter. 299 00:18:35,610 --> 00:18:39,170 >> Så hvordan får vi lengden av s? 300 00:18:39,170 --> 00:18:43,190 Vel, er trikset på utkikk etter denne tilbakeslag 0 karakter, dette null 301 00:18:43,190 --> 00:18:44,380 terminator. 302 00:18:44,380 --> 00:18:50,270 Så algoritmen Kommer å være noe som få 303 00:18:50,270 --> 00:18:51,510 nok tegn på at - 304 00:18:51,510 --> 00:18:56,180 la oss ha denne hånden representerer noen teller, la oss kalle denne int lengde. 305 00:18:56,180 --> 00:19:00,060 Så, fra over her, er vi kommer til å iterere over vår streng. 306 00:19:00,060 --> 00:19:04,100 >> Så det første tegnet, er det H, og det er ikke tilbake slash 0, så 307 00:19:04,100 --> 00:19:05,170 lengden er en. 308 00:19:05,170 --> 00:19:08,050 Iterere til neste tegn, E, og det er ikke backslash 0. 309 00:19:08,050 --> 00:19:09,630 Lengde er to. 310 00:19:09,630 --> 00:19:10,960 L, 3. 311 00:19:10,960 --> 00:19:11,850 L, fire. 312 00:19:11,850 --> 00:19:13,050 O, 5. 313 00:19:13,050 --> 00:19:16,690 Og til slutt, når vi backslash 0, og så det betyr, vel, 314 00:19:16,690 --> 00:19:17,780 denne strengen er over. 315 00:19:17,780 --> 00:19:20,130 Så la oss gå tilbake fem. 316 00:19:20,130 --> 00:19:33,630 >> Så faktisk implementere det, først, min n lengde lik 0, min høyre hånd. 317 00:19:33,630 --> 00:19:36,088 Og vi kommer til å reagere - 318 00:19:36,088 --> 00:19:38,000 >> SPEAKER 1: [uhørbart] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Oh, skyt. 320 00:19:38,640 --> 00:19:39,870 God samtale. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Så n lengde lik 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Så nå, ikke mens s lengde lik og da, backslash 0. 325 00:19:58,310 --> 00:20:04,660 Så husk, dette backslash 0, er det en faktiske karakter, og det indikerer 326 00:20:04,660 --> 00:20:05,820 slutten av strengen. 327 00:20:05,820 --> 00:20:09,850 Akkurat som, også, skråstrek n er et faktisk tegn. 328 00:20:09,850 --> 00:20:14,040 Backslash 0 kommer til å indikere slutten av strengen. 329 00:20:14,040 --> 00:20:15,414 Jeg ønsker ikke å sette det der. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 Og mens s indeksert av lengden er ikke lik null terminator, og deretter 332 00:20:25,620 --> 00:20:27,130 vi bare kommer til å øke lengden. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Så, på slutten av programmet vårt, Lengden er slutt kommer til å 335 00:20:34,880 --> 00:20:37,610 være 5 i dette tilfellet. 336 00:20:37,610 --> 00:20:39,210 Og vi vil bare returnere lengden. 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å nå her nede, det gjør jeg ikke gjøre my_strlen. 340 00:20:48,290 --> 00:20:50,700 La oss kompilere den for å være sikker alt går som det skal. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Gjorde jeg i to? 343 00:20:58,210 --> 00:21:00,565 Eller var det en? 344 00:21:00,565 --> 00:21:01,940 Det burde gjøre. 345 00:21:01,940 --> 00:21:02,690 OK. 346 00:21:02,690 --> 00:21:08,490 Så dette er argv to. 347 00:21:08,490 --> 00:21:11,585 Fungerer som forventet, selv om var at den 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 versjonen av ting ikke har printf ny linje etter, men det 352 00:21:21,820 --> 00:21:22,910 gjør ikke noen forskjell. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 Så fungerte som forventet. 355 00:21:25,780 --> 00:21:34,750 >> Nå kan vi også kombinere dette ett skritt videre, hvor varsel her, vel, 356 00:21:34,750 --> 00:21:38,920 første, vi gripe strlen av argv jeg, og så skal vi itera løpet 357 00:21:38,920 --> 00:21:41,450 hvert tegn i strengen. 358 00:21:41,450 --> 00:21:47,480 Så i stedet for å gjøre det, hva om vi bare kombinere denne logikken av å vente 359 00:21:47,480 --> 00:21:50,740 før vi traff backslash 0 riktig inn i dette for loop? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Så iterere mens argv i, j gjør ikke lik backslash 0. 362 00:22:07,490 --> 00:22:10,680 Så la oss kjøre det første. 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 tilstanden mener - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 La oss fjerne det. 368 00:22:40,060 --> 00:22:49,140 Så nå, la dette være vår argv. 369 00:22:49,140 --> 00:22:55,290 Så når jeg bare løp det programmet før, argv er en rekke strenger. 370 00:22:55,290 --> 00:23:03,100 Og så, hvis jeg kjører det med dot slash argv 2, hallo verden, så argv 371 00:23:03,100 --> 00:23:07,650 selv er lengden 3, for argv null, hallo, og verden. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> Og på innsiden av hver av disse indekser er, selv en matrise, hvor dette vil være 374 00:23:19,660 --> 00:23:23,780 prikk, vil dette være skråstrek, vet jeg ikke hvis det var riktig 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 dash, trenger mer plass. 377 00:23:30,110 --> 00:23:32,570 La oss skjære inn i denne matrisen. 378 00:23:32,570 --> 00:23:38,230 A-R-V dash 0, og deretter backslash 0. 379 00:23:38,230 --> 00:23:43,160 Og så i uorden vil være hallo. 380 00:23:43,160 --> 00:23:45,910 La oss si, H-E backslash 0. 381 00:23:45,910 --> 00:23:51,130 Og til slutt, W-O backslash 0. 382 00:23:51,130 --> 00:23:59,730 >> Så algoritmen som vi nettopp skrev, den nestet for looper, hva de er 383 00:23:59,730 --> 00:24:07,321 gjør er, må vi først ha motvirke i og j. 384 00:24:07,321 --> 00:24:15,206 Dette ville bli enklere med koden på skjermen, La oss gå tilbake til dette. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 Så merker at jeg er den iterator som er itera over hver kommando 387 00:24:24,600 --> 00:24:25,610 linjen argument. 388 00:24:25,610 --> 00:24:28,870 Og j er iterator itera løpet av hvert tegn i det 389 00:24:28,870 --> 00:24:30,410 Argumentet for kommandolinjen. 390 00:24:30,410 --> 00:24:46,755 Så hva dette innerste printf gjø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 seks, men nå, argv 0 7 kommer til å 392 00:24:58,680 --> 00:25:00,670 lik backslash 0. 393 00:25:00,670 --> 00:25:05,730 >> Så da vi avslutte det for loop, og nå jeg gjentar til en. 394 00:25:05,730 --> 00:25:10,910 Og nå skal vi print argv en 0, argv en 1 - 395 00:25:10,910 --> 00:25:17,040 vel, nå, siden jeg kuttet hallo kort, argv en to er igjen kommer til å være 396 00:25:17,040 --> 00:25:18,170 backslash 0. 397 00:25:18,170 --> 00:25:25,050 Og så, øke jeg og fortsette, og så videre, helt til vi skrive ut alle 398 00:25:25,050 --> 00:25:28,580 verden, og de er tre kommandolinje argumenter, og vi vil gå ut av 399 00:25:28,580 --> 00:25:31,670 den ytterste løkke og føre 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å la oss komme tilbake hit. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Så du vil få noe kjennskap til kommandolinje argumenter på dette 406 00:25:52,370 --> 00:25:54,460 spesielt problem satt. 407 00:25:54,460 --> 00:25:56,630 >> Nå, debugging. 408 00:25:56,630 --> 00:26:01,680 Så har du sannsynligvis allerede har hatt å gjøre noen debugging med den forrige 409 00:26:01,680 --> 00:26:03,120 oppgavesettet. 410 00:26:03,120 --> 00:26:08,420 Og en veldig enkel måte å debugging, først, la oss se på en buggy program. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Vel, gå gjennom dette programmet, vi kommer til å be brukeren for en 413 00:26:23,830 --> 00:26:29,350 heltall, grip som heltall, og deretter, vilkårlig, har vi en stund loop som 414 00:26:29,350 --> 00:26:32,280 er bare kommer til å minske jeg før det er lik 10. 415 00:26:32,280 --> 00:26:35,820 La oss bare anta jeg inn et helt tall som er større enn 10 år. 416 00:26:35,820 --> 00:26:38,700 Så decrement jeg før det er lik 10. 417 00:26:38,700 --> 00:26:42,630 >> Og så har vi en annen mens loop det, mens jeg ikke er lik 0, er vi 418 00:26:42,630 --> 00:26:44,540 kommer til å minske jeg ved tre. 419 00:26:44,540 --> 00:26:49,790 Så hvis du ser hensikten med bug her, er det at dette vil minske i å 420 00:26:49,790 --> 00:26:57,010 være 10, og deretter denne mens loop vilje minking i fra 10 til 7, 4, 1, 421 00:26:57,010 --> 00:27:02,880 til minus 2, til minus 5, og så videre; til negative uendelig, siden jeg vil 422 00:27:02,880 --> 00:27:05,920 faktisk aldri lik 0. 423 00:27:05,920 --> 00:27:08,610 Og deretter ved slutten av dette program, Vi har foo-funksjon som er 424 00:27:08,610 --> 00:27:12,130 går på print ut som jeg. 425 00:27:12,130 --> 00:27:16,520 >> Dette er altså en kort og trivielt program og feilen er åpenbar, 426 00:27:16,520 --> 00:27:18,790 spesielt etter at jeg bare sa hva feilen var. 427 00:27:18,790 --> 00:27:24,840 Men hensikten her er, vel, kanskje dette faktisk ser ut som noen av dine 428 00:27:24,840 --> 00:27:30,040 løsninger fra grådig fra den siste oppgavesettet, og kanskje du har 429 00:27:30,040 --> 00:27:32,800 noen uendelig loop i programmet, og du har ingen anelse 430 00:27:32,800 --> 00:27:34,100 hva som forårsaker det. 431 00:27:34,100 --> 00:27:38,690 Så en veldig nyttig debugging teknikk er å bare legge printfs 432 00:27:38,690 --> 00:27:40,180 hele koden din. 433 00:27:40,180 --> 00:27:49,200 >> Så her jeg vil ha en printf utenfor første mens loop. 434 00:27:49,200 --> 00:27:53,155 Og her jeg vil ha en printf, og jeg skal bare skrive jeg. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Jeg skal gjøre enda første mens loop, jeg. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 Utenfor, andre mens loop. 439 00:28:09,040 --> 00:28:12,170 Igjen, skrive ut inni av her, verdien jeg. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 Og la oss kjøre dette. 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 Skriv inn et heltall. 445 00:28:25,610 --> 00:28:28,150 La oss gjøre 13. 446 00:28:28,150 --> 00:28:28,760 Og bom. 447 00:28:28,760 --> 00:28:33,300 Vi ser at vi er uendelig looping på innsiden av den andre, mens sløyfen. 448 00:28:33,300 --> 00:28:36,305 Så nå vet vi hva feilen er. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Men printf debugging er helt flott, men når programmene dine får 451 00:28:45,610 --> 00:28:50,560 lengre og mer komplisert, er det mer avanserte løsninger til 452 00:28:50,560 --> 00:28:51,705 få ting fungerer. 453 00:28:51,705 --> 00:28:52,955 Så la oss fjerne alle disse printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 Og la oss sørge for at jeg ikke gjorde det ødelegge noe. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Så programmet vi skal å innføre kalles 458 00:29:14,180 --> 00:29:16,715 GDB, for GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Vel, faktisk, la oss fjerne debug for et sekund, og foreta debug nytt. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Vel, faktisk første, en god leksjon i kommandolinjeargumenter. 463 00:29:34,440 --> 00:29:37,780 Legg merke til at dette Clang kommando som er kompilere alt er gått 464 00:29:37,780 --> 00:29:41,300 på kommandolinjen, disse kommandolinjeargumentene. 465 00:29:41,300 --> 00:29:46,250 Så nøyaktig hvordan du skal bruke kommandolinjeargumenter, som vi 466 00:29:46,250 --> 00:29:51,500 gjorde før, og som du vil i PSett 2, det er hvordan Clang bruker dem. 467 00:29:51,500 --> 00:30:00,070 >> Så merker at dette første flagg, dash ggdb3, hva det er å si er, Clang, 468 00:30:00,070 --> 00:30:03,790 du bør kompilere denne filen med hensikt at vi vil til slutt 469 00:30:03,790 --> 00:30:05,380 trenger å feilsøke det. 470 00:30:05,380 --> 00:30:13,840 Så så lenge du har det flagget, så vi kan GDB debug. 471 00:30:13,840 --> 00:30:17,380 Og det vil åpne opp GNU Debugger. 472 00:30:17,380 --> 00:30:22,920 >> Så det er mange kommandoer at du trenger å bli vant til. 473 00:30:22,920 --> 00:30:27,100 Først en som du sannsynligvis umiddelbart trenger er Run. 474 00:30:27,100 --> 00:30:28,200 Så hva er Kjør kommer til å gjøre? 475 00:30:28,200 --> 00:30:30,910 Det kommer til å starte programmet vårt. 476 00:30:30,910 --> 00:30:36,180 Så kjøre, starter programmet, vil programmet spør oss for et heltall, 13. 477 00:30:36,180 --> 00:30:39,170 Og så er det uendelig looping som forventet, bortsett fra at jeg fjernet 478 00:30:39,170 --> 00:30:40,500 printfs, så vi trenger ikke engang se det. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Gått ut på vanlig måte. 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 mulig at det pakket alle veien rundt, tilbake til - ignorerer det. 484 00:30:53,640 --> 00:30:55,170 Anta det gjorde ikke gå ut som normalt. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Det er et komplisert svar på det. 487 00:31:03,370 --> 00:31:07,890 >> Så nå, det er ikke veldig nyttig. 488 00:31:07,890 --> 00:31:11,480 Så bare kjører programmet vårt innsiden av dette debugger hjelper ikke oss på noen 489 00:31:11,480 --> 00:31:15,610 måte, siden vi kunne ha gjort dot slash debug fra utenfor GDB. 490 00:31:15,610 --> 00:31:21,250 Så den en kommando som Du vil sannsynligvis - 491 00:31:21,250 --> 00:31:22,970 og jeg skal avslutte dette. 492 00:31:22,970 --> 00:31:25,850 Kontroll-d eller slutte, både arbeid. 493 00:31:25,850 --> 00:31:29,550 Så la oss åpne den opp igjen. 494 00:31:29,550 --> 00:31:31,130 >> En annen kommando som du sannsynligvis umiddelbart vil 495 00:31:31,130 --> 00:31:33,600 venne seg til er Break. 496 00:31:33,600 --> 00:31:37,120 Så vi vil bryte på hoved for nå, og så skal jeg forklare det. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Vel, her ser vi at vi satt et stoppunkt på denne linjen i debug.c. 499 00:31:46,370 --> 00:31:50,160 Så hva pause betyr er at når jeg skriver løp, er programmet kommer til å 500 00:31:50,160 --> 00:31:53,560 fortsetter til Jeg traff et stoppunkt. 501 00:31:53,560 --> 00:31:59,390 Så når jeg treffer løp, starter programmet, og da det bryter så snart det 502 00:31:59,390 --> 00:32:01,940 kommer inn i hovedfunksjon. 503 00:32:01,940 --> 00:32:06,930 Bryt hoved kommer til å være noe du ganske ofte gjør. 504 00:32:06,930 --> 00:32:11,340 >> Og nå, for å introdusere deg til noen flere kommandoer. 505 00:32:11,340 --> 00:32:14,330 Legg merke til her, at det er å si vi brakk ved linjen 11, som ligger 506 00:32:14,330 --> 00:32:16,230 printf, oppgi et heltall. 507 00:32:16,230 --> 00:32:21,260 Så kommandoen Neste kommer til å være hvordan vi går til neste linje med kode. 508 00:32:21,260 --> 00:32:24,810 Dette kommer til å tillate oss å gå gjennom vårt program linje for linje. 509 00:32:24,810 --> 00:32:26,260 Så neste. 510 00:32:26,260 --> 00:32:29,820 >> Nå linje 12, skal vi for å få den helt tall. 511 00:32:29,820 --> 00:32:30,450 Neste. 512 00:32:30,450 --> 00:32:34,290 Og hvis du bare trykke Enter igjen, det vil gjenta det siste du gjorde. 513 00:32:34,290 --> 00:32:36,480 Så jeg trenger ikke å skrive ved siden av hver gang. 514 00:32:36,480 --> 00:32:40,100 Så skriv et heltall, 13. 515 00:32:40,100 --> 00:32:46,940 Så nå, mens jeg er større linje 14, enn 10, og jeg skal gjøre videre. 516 00:32:46,940 --> 00:32:48,685 Og vi ser at vi kommer til å minske jeg. 517 00:32:48,685 --> 00:32:50,210 Så vi kommer til å minske i på nytt. 518 00:32:50,210 --> 00:32:53,620 >> Så nå, en annen nyttig kommandoen Skriv ut. 519 00:32:53,620 --> 00:32:55,750 Så Print kommer til å skrive ut verdien av variabelen. 520 00:32:55,750 --> 00:32:57,825 La oss få frem verdien av variabelen i. 521 00:32:57,825 --> 00:32:58,705 La oss skrive ut jeg. 522 00:32:58,705 --> 00:33:00,910 Det kommer til å si at jeg er 11. 523 00:33:00,910 --> 00:33:03,330 Nå er vi Neste igjen mens i er større enn 10. 524 00:33:03,330 --> 00:33:05,590 Så jeg er fortsatt større enn 10, siden det er 11. 525 00:33:05,590 --> 00:33:06,920 Jeg minus minus. 526 00:33:06,920 --> 00:33:08,250 La oss skrive i på nytt. 527 00:33:08,250 --> 00:33:10,950 Som forventet, er det 10. 528 00:33:10,950 --> 00:33:12,510 >> Så nå, neste. 529 00:33:12,510 --> 00:33:16,250 Det kommer tilbake til tilstanden, er jeg større enn 10, men i er nå 10, slik at 530 00:33:16,250 --> 00:33:20,040 det er ikke større enn 10, så vi forventer den til å falle ut av, mens sløyfen. 531 00:33:20,040 --> 00:33:22,220 Og nå er vi under den linjen med kode. 532 00:33:22,220 --> 00:33:28,750 Og en annen kommando, Liste, er bare kommer å vise forrige og neste 533 00:33:28,750 --> 00:33:31,240 par linjer med kode, i Hvis du har mistet deg selv. 534 00:33:31,240 --> 00:33:35,420 Så vi bare gått ut dette mens loop, og nå har vi inngått dette 535 00:33:35,420 --> 00:33:37,080 mens loop, linje 18. 536 00:33:37,080 --> 00:33:39,860 Så mens jeg ikke lik 0. 537 00:33:39,860 --> 00:33:46,570 Og, neste, jeg er lik i minus 3, og vi vil legge merke til, vil dette bare fortsette. 538 00:33:46,570 --> 00:33:48,270 Og vi kan skrive ut jeg. 539 00:33:48,270 --> 00:33:49,990 >> Hver kommando liksom har snarveier. 540 00:33:49,990 --> 00:33:51,720 Så p er forkortelse for trykk. 541 00:33:51,720 --> 00:33:53,400 Så vi kan p jeg. 542 00:33:53,400 --> 00:33:57,550 Bare fortsett å holde n, eller fortsette å gjøre Neste. 543 00:33:57,550 --> 00:33:58,340 Skriv ut i på nytt. 544 00:33:58,340 --> 00:34:00,380 Du ser nå er det negativ 167. 545 00:34:00,380 --> 00:34:06,030 Så dette vil fortsette i det uendelige, men ikke egentlig alltid, siden du nettopp så, det 546 00:34:06,030 --> 00:34:09,330 faktisk vil ende på et tidspunkt. 547 00:34:09,330 --> 00:34:15,699 >> Så det er Begynnelsen GDB. 548 00:34:15,699 --> 00:34:19,504 Men la oss gjøre en ting i GDB. 549 00:34:19,504 --> 00:34:20,754 Uh, feilsøke. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Så, i dette spesielle tilfellet, uendelig løkke som skjedde til å være inne i 552 00:34:28,534 --> 00:34:30,050 den viktigste funksjonen. 553 00:34:30,050 --> 00:34:35,779 Og for nå, bare akseptere at det er jeg kommer til å flytte uendelig løkke inn 554 00:34:35,779 --> 00:34:37,029 foo funksjon. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Bare husk at ved slutten av denne program, vel, dette var opprinnelig 557 00:34:43,730 --> 00:34:46,210 ringer foo, som var bare kommer til å skrive ut jeg. 558 00:34:46,210 --> 00:34:51,880 Men nå er vi kaller foo, som er kommer til å minske i før det er 0, og 559 00:34:51,880 --> 00:34:54,548 deretter skrive ut den variabelen. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Lagre som. 562 00:34:57,970 --> 00:35:00,175 Gjør debug. 563 00:35:00,175 --> 00:35:03,310 Og nå, 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 kjøre så jeg ikke kommer til å være i stand til å faktisk gå gjennom min 566 00:35:10,580 --> 00:35:11,730 programmet linje for linje. 567 00:35:11,730 --> 00:35:19,820 Så la oss bryte på hoved, og deretter skrive inn hus. 568 00:35:19,820 --> 00:35:28,160 Så gå gjennom dette, printf, skriv et heltall, får heltall, 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Så vi kommer til å holde minking inntil i er større enn 10. 571 00:35:37,490 --> 00:35:42,840 Så får vi kommer til å falle gjennom mens loop, og få til linjen - 572 00:35:42,840 --> 00:35:44,364 La oss åpne den opp i et eget vindu. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Så vi dekrementert før jeg var ikke lenger større enn 10, og da vi 575 00:35:53,300 --> 00:35:55,700 kalte funksjonen, foo. 576 00:35:55,700 --> 00:36:01,340 >> Så hva skjedde så snart jeg traff funksjon foo, vel, jeg ringte foo, og 577 00:36:01,340 --> 00:36:04,030 da jeg ikke lenger hadde kontroll over GDB. 578 00:36:04,030 --> 00:36:10,230 Så så snart jeg traff Neste på denne linjen, ting fortsatte frem til dette skjedde, 579 00:36:10,230 --> 00:36:12,400 der programmet gått ut når - 580 00:36:12,400 --> 00:36:14,450 anta at det eksisterte ikke slutt. 581 00:36:14,450 --> 00:36:16,390 Du så det pause for litt skjønt. 582 00:36:16,390 --> 00:36:22,040 Så hvorfor gjorde jeg mister kontrollen over programmet på det tidspunktet? 583 00:36:22,040 --> 00:36:27,540 Vel, når jeg skriver neste, som går til den bokstave neste linje med kode som 584 00:36:27,540 --> 00:36:28,850 vil utføre. 585 00:36:28,850 --> 00:36:35,950 Så etter linje 21, den neste linje med kode som vil utføre er linje 22, 586 00:36:35,950 --> 00:36:38,520 som er, spennende fra hoved. 587 00:36:38,520 --> 00:36:43,810 Så jeg vil ikke bare gå til den neste linje med kode. 588 00:36:43,810 --> 00:36:48,170 Jeg ønsker å gå inn i funksjonen, foo, og da også gå gjennom 589 00:36:48,170 --> 00:36:49,830 disse linjene med kode. 590 00:36:49,830 --> 00:36:53,726 >> Så for det, har vi et alternativ. 591 00:36:53,726 --> 00:36:56,770 La oss avslutte det igjen. 592 00:36:56,770 --> 00:36:58,020 Bryt hoved. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, neste, neste, 13, neste, neste, neste, nøye, 595 00:37:06,370 --> 00:37:09,820 før vi traff linjen foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> Så nå er vi på linje 21, der vi kaller foo. 598 00:37:13,700 --> 00:37:17,100 Vi ønsker ikke å skrive neste, siden det vil bare kaller funksjonen foo, og 599 00:37:17,100 --> 00:37:18,710 gå til neste linje med kode. 600 00:37:18,710 --> 00:37:20,840 Hva vi ønsker å bruke er Step. 601 00:37:20,840 --> 00:37:25,690 Så det er en forskjell mellom Step og neste, der trinn går inn i 602 00:37:25,690 --> 00:37:28,190 fungere, og neste går over funksjonen. 603 00:37:28,190 --> 00:37:32,830 Den utfører bare helheten av funksjon og fortsetter å gå. 604 00:37:32,830 --> 00:37:37,210 >> Så Step kommer til å bringe oss inn i funksjonen, foo. 605 00:37:37,210 --> 00:37:41,160 Og vi ser her, nå er vi tilbake på dette mens loop som er, i teorien, 606 00:37:41,160 --> 00:37:44,190 kommer til å fortsette for alltid. 607 00:37:44,190 --> 00:37:50,420 Og hvis du treffer Step, når det ikke engang en funksjon for å ringe, så er det 608 00:37:50,420 --> 00:37:51,720 identisk med Next. 609 00:37:51,720 --> 00:37:55,320 Så det er bare når du er på en linje som kaller en funksjon som Step 610 00:37:55,320 --> 00:37:56,970 kommer til å avvike fra Next. 611 00:37:56,970 --> 00:37:57,930 Så Step vil bringe oss her. 612 00:37:57,930 --> 00:38:02,100 Trinn for trinn, trinn for trinn, trinn for trinn, og Vi får bare uendelig loop for alltid. 613 00:38:02,100 --> 00:38:06,810 >> Så du kan venne deg til det som din måte å identifisere uendelige løkker, er 614 00:38:06,810 --> 00:38:08,960 bare å holde dette Enter-tasten for å se hvor du står fast. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Det finnes bedre måter å gjøre det, men for nå, er at helt tilstrekkelig. 617 00:38:14,780 --> 00:38:17,967 Og stilistisk, for å samsvare med stil 50, jeg burde ha 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 siste kommando for å innføre. 621 00:38:28,400 --> 00:38:30,810 Vel, la oss GDB debug i. 622 00:38:30,810 --> 00:38:35,580 Så i stedet for å bryte på hoved, hvis jeg kjenner foo-funksjonen er også 623 00:38:35,580 --> 00:38:39,230 problem, så jeg kunne bare ha sa, bryte på foo, i stedet. 624 00:38:39,230 --> 00:38:42,310 La oss si at jeg bryter på både hoved-og foo. 625 00:38:42,310 --> 00:38:45,390 Så du kan stille så mange stoppunkter som du ønsker. 626 00:38:45,390 --> 00:38:49,230 Når jeg skriver løp, det kommer å stoppe på - 627 00:38:49,230 --> 00:38:52,180 ooh, la oss rekompilere, siden Jeg endret ting. 628 00:38:52,180 --> 00:38:55,950 Du vil se denne linjen, Advarsel, kilde filen er nyere enn kjørbar. 629 00:38:55,950 --> 00:38:59,680 Så det betyr at jeg bare gikk inn her og endret disse til å samsvare med stil 630 00:38:59,680 --> 00:39:03,100 50, men jeg gjorde ikke rekompilere programmet. 631 00:39:03,100 --> 00:39:04,870 Så GDB gjør meg oppmerksom på det. 632 00:39:04,870 --> 00:39:10,130 Jeg skal slutte, gjør debug igjen, treffe gdb debug. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> Så nå, tilbake til hva jeg gjorde. 635 00:39:12,800 --> 00:39:15,720 Bryt hoved, break foo. 636 00:39:15,720 --> 00:39:20,680 Nå hvis jeg kjører programmet, så det er kommer til å fortsette inntil treffer en 637 00:39:20,680 --> 00:39:21,320 stoppunkt. 638 00:39:21,320 --> 00:39:24,680 At stoppunkt skjer med bli den første til hoved. 639 00:39:24,680 --> 00:39:28,630 Nå, i stedet for å gjøre neste, neste, neste, neste, neste, før jeg traff foo, jeg 640 00:39:28,630 --> 00:39:35,230 kan skrive fortsette, noe som vil fortsette til du treffer neste stoppunkt. 641 00:39:35,230 --> 00:39:37,200 Jeg må gå inn i heltall først. 642 00:39:37,200 --> 00:39:40,570 Fortsett vil fortsette helt til jeg traff neste stoppunkt, som er at 643 00:39:40,570 --> 00:39:43,320 funksjon av foo. 644 00:39:43,320 --> 00:39:50,130 >> Så Run vil kjøre helt til du treffer en stoppunkt, men du bare skriver løp når 645 00:39:50,130 --> 00:39:54,060 du starter programmet, og deretter, fra da av er det fortsette. 646 00:39:54,060 --> 00:40:01,950 Hvis jeg bare gjorde bryte hoved og så løp, vil det bryte på 647 00:40:01,950 --> 00:40:03,670 viktigste, og deretter fortsette. 648 00:40:03,670 --> 00:40:10,050 Siden jeg ikke har et knekkpunkt på foo, angi heltall, så nå er jeg 649 00:40:10,050 --> 00:40:11,380 ikke kommer til å bryte på foo. 650 00:40:11,380 --> 00:40:16,318 Det er bare kommer til uendelig løkke til 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 begynne å bruke det i problem settene. 655 00:40:27,790 --> 00:40:30,550 Det kan være svært nyttig å identifisere feil. 656 00:40:30,550 --> 00:40:35,280 Hvis du faktisk bare, linje for linje, gå gjennom koden din, og sammenligne hva som er 657 00:40:35,280 --> 00:40:39,740 faktisk skjer med hva du forventer å skje, så det er ganske 658 00:40:39,740 --> 00:40:41,060 vanskelig å gå glipp av dine feil. 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å forrige uke David brakt opp dette hemmelig-nøkkel kryptografi ting for 663 00:40:54,040 --> 00:40:59,350 første gang, der vi ikke ønsker passord bare lagret i vår 664 00:40:59,350 --> 00:41:03,210 datamaskin i noen vanlig tekstfil, hvor noen kan komme over og bare 665 00:41:03,210 --> 00:41:04,660 åpne den opp og lese dem. 666 00:41:04,660 --> 00:41:07,530 Ideelt sett ville de bli kryptert på en eller annen måte. 667 00:41:07,530 --> 00:41:13,340 Og i oppgave Set 2, vil du bli håndtere med en metode for kryptering, 668 00:41:13,340 --> 00:41:16,520 eller, vel, to metoder, men de er ikke så stor. 669 00:41:16,520 --> 00:41:20,050 Hvis du gjør det hacker-utgaven, er du også kommer til å være med å gjøre 670 00:41:20,050 --> 00:41:22,150 dekryptering av noen ting. 671 00:41:22,150 --> 00:41:29,770 >> Så spørsmålet er nå, vel, selv om vi har den sterkeste krypteringen 672 00:41:29,770 --> 00:41:34,830 algoritmen i verden, hvis du velger en spesielt dårlig passord, så er det 673 00:41:34,830 --> 00:41:37,720 vil ikke hjelpe deg veldig mye, siden folk vil fortsatt være i stand til å finne det ut. 674 00:41:37,720 --> 00:41:41,530 Selv om å se den krypterte strengen og det ser ut som et rot av søppel 675 00:41:41,530 --> 00:41:44,760 som betyr noe for dem, hvis de fortsatt bare trenger å prøve noen passord 676 00:41:44,760 --> 00:41:50,560 å finne ut av det, så du er ikke veldig sikker. 677 00:41:50,560 --> 00:41:55,890 Så ser en video som gjør det punktet. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [VIDEOAVSPILLING] 680 00:42:00,970 --> 00:42:02,100 >> -Hjelm, djevel deg. 681 00:42:02,100 --> 00:42:03,370 Hva er det som skjer? 682 00:42:03,370 --> 00:42:05,170 Hva gjør du til min datter? 683 00:42:05,170 --> 00:42:09,910 >> -Tillat meg å presentere den briljante ung plastisk kirurg, Dr. Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, den største nesen jobb mann i hele 685 00:42:13,730 --> 00:42:16,080 univers, og Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Deres Høyhet. 687 00:42:17,210 --> 00:42:18,070 >> -Nose jobb? 688 00:42:18,070 --> 00:42:18,670 Jeg forstår ikke. 689 00:42:18,670 --> 00:42:20,090 Hun har allerede hatt en nese jobb. 690 00:42:20,090 --> 00:42:21,910 Det var en søt seksten tilstede. 691 00:42:21,910 --> 00:42:22,140 >> -Nei. 692 00:42:22,140 --> 00:42:23,690 Det er ikke hva du tror. 693 00:42:23,690 --> 00:42:25,420 Det er mye, mye verre. 694 00:42:25,420 --> 00:42:30,300 Hvis du ikke gir meg den kombinasjonen til luften skjold, Dr. Schlotkin vil 695 00:42:30,300 --> 00:42:34,226 gi din datter tilbake sin gamle nesen. 696 00:42:34,226 --> 00:42:35,476 >> -Nei. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 Hvor fikk du den? 699 00:42:40,516 --> 00:42:41,440 >> -Greit. 700 00:42:41,440 --> 00:42:42,180 Jeg skal fortelle. 701 00:42:42,180 --> 00:42:43,381 Jeg skal fortelle. 702 00:42:43,381 --> 00:42:44,263 Nei, pappa. 703 00:42:44,263 --> 00:42:45,590 Nei, du må ikke. 704 00:42:45,590 --> 00:42:46,860 >> -Du har rett, min kjære. 705 00:42:46,860 --> 00:42:48,450 Jeg kommer til å savne den nye nesen. 706 00:42:48,450 --> 00:42:52,090 Men jeg vil ikke fortelle ham kombinasjonen, uansett hva. 707 00:42:52,090 --> 00:42:53,680 >> -Veldig godt. 708 00:42:53,680 --> 00:42:55,685 Dr. Schlotkin, gjør din verste. 709 00:42:55,685 --> 00:42:56,914 >> -Min glede. 710 00:42:56,914 --> 00:43:00,690 >> [TOOLS skjerpes] 711 00:43:00,690 --> 00:43:01,910 >> -Nei. 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 skal fortelle. 715 00:43:05,300 --> 00:43:06,880 Jeg skal fortelle. 716 00:43:06,880 --> 00:43:09,130 >> -Jeg visste at det ville fungere. 717 00:43:09,130 --> 00:43:09,900 OK. 718 00:43:09,900 --> 00:43:12,850 Gi den til meg. 719 00:43:12,850 --> 00:43:16,918 >> -Kombinasjonen er ett. 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å kombinasjonen er en, to, tre, fire, fem. 735 00:43:34,770 --> 00:43:37,460 Det er det dummeste kombinasjonen Jeg noensinne har hørt i mitt liv. 736 00:43:37,460 --> 00:43:39,710 Det er den type ting en idiot ville ha på bagasjen sin. 737 00:43:39,710 --> 00:43:42,000 >> -Takk, din Høyhet. 738 00:43:42,000 --> 00:43:43,530 >> -Hva har du gjort? 739 00:43:43,530 --> 00:43:44,490 >> -Jeg slått av veggen. 740 00:43:44,490 --> 00:43:45,420 >> -Nei det gjorde du ikke. 741 00:43:45,420 --> 00:43:45,840 Du slått av hele filmen. 742 00:43:45,840 --> 00:43:46,930 >> -Jeg må ha trykket på feil knapp. 743 00:43:46,930 --> 00:43:48,265 >> -Vel, sette den på igjen. 744 00:43:48,265 --> 00:43:49,110 Sett filmen tilbake på. 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 >> -La oss 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 vet jeg vil likevel nødt til å fakturere deg for dette. 750 00:43:53,060 --> 00:43:53,440 >> [END VIDEOAVSPILLING] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: Greit. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Så nå som vi allerede snakker om sikkerhet på noen måter, fin 754 00:44:08,430 --> 00:44:16,050 liten film plakat, så i siste dager, disse problemene med NSA 755 00:44:16,050 --> 00:44:17,300 overvåke alt. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Det kan være vanskelig å føle at du har noen form for personvernet i 758 00:44:26,930 --> 00:44:34,540 elektroniske verden, selv om jeg ikke kunne fortelle du mest av detaljene i PRISM. 759 00:44:34,540 --> 00:44:42,130 Så beveger seg utover PRISM, skal vi ikke snakke om det, nå 760 00:44:42,130 --> 00:44:44,030 tenke på den bærbare datamaskinen. 761 00:44:44,030 --> 00:44:48,360 Så her oppe, jeg ønsker å bytte til min faktiske konto, 762 00:44:48,360 --> 00:44:50,370 med min lille pingvinen. 763 00:44:50,370 --> 00:44:57,310 Så jeg har et passord sett, og at Passordet er hva jeg vil den skal være. 764 00:44:57,310 --> 00:45:02,430 >> Men husk at det jeg logger på med, så dette innlogging 765 00:45:02,430 --> 00:45:04,850 teksten, er noen program. 766 00:45:04,850 --> 00:45:07,910 Det er noen program som var skrevet av noen person. 767 00:45:07,910 --> 00:45:13,250 Og så, som person, hvis de er spesielt skadelig, de kunne 768 00:45:13,250 --> 00:45:17,780 har sagt, all right, så hvis passordet at jeg kommer inn er lik min 769 00:45:17,780 --> 00:45:22,800 faktiske passordet, eller det er lik til noen spesiell passord - 770 00:45:22,800 --> 00:45:25,550 David er kjempebra eller noe - 771 00:45:25,550 --> 00:45:27,190 så la dem i. 772 00:45:27,190 --> 00:45:33,760 Så en ondsinnet programmerer kunne ha tilgang til alle dine Mac-maskiner, eller 773 00:45:33,760 --> 00:45:36,150 Windows, eller noe. 774 00:45:36,150 --> 00:45:41,980 >> Så det er ikke mye av en bekymring, siden, Jeg mener, er dette login-programmet 775 00:45:41,980 --> 00:45:48,720 som er levert med OS X, hundrevis eller tusenvis av mennesker har 776 00:45:48,720 --> 00:45:50,020 anmeldt denne koden. 777 00:45:50,020 --> 00:45:55,330 Og så, hvis, i koden et sted, du si om denne strengen tilsvarer likemenn 778 00:45:55,330 --> 00:45:58,860 David er kjempebra, logg, så noen er kommer til å være, som, vent. 779 00:45:58,860 --> 00:45:59,800 Dette er ikke riktig. 780 00:45:59,800 --> 00:46:01,790 Dette burde ikke være her. 781 00:46:01,790 --> 00:46:06,650 Så det er en måte vi få ting å være snill for sikker. 782 00:46:06,650 --> 00:46:10,300 >> Men tenk om enda programmer at du skriver. 783 00:46:10,300 --> 00:46:13,000 La oss si at du skrev login programmet. 784 00:46:13,000 --> 00:46:20,440 Så dette login program som du skrev, så åpenbart, er du en god 785 00:46:20,440 --> 00:46:21,210 programmerer. 786 00:46:21,210 --> 00:46:25,610 Du kommer ikke til å sette noen ondsinnet hvis x er lik lik David er kjempebra 787 00:46:25,610 --> 00:46:27,860 inn koden din. 788 00:46:27,860 --> 00:46:31,930 Men dette programmet, hva gjør du bruker å kompilere dette programmet? 789 00:46:31,930 --> 00:46:34,180 Noe som Clang. 790 00:46:34,180 --> 00:46:38,460 Så hva om den personen som har skjedd med skrive Clang spesiell rettssak i Clang 791 00:46:38,460 --> 00:46:44,310 noe sånt, hvis jeg kompilere logg inn programmet, deretter inn denne koden 792 00:46:44,310 --> 00:46:49,720 inn login programmet som sier, hvis x er lik lik David er fantastisk? 793 00:46:49,720 --> 00:46:59,890 Så ikke helt ennå, men vi har den samme utstede her, hvor Clang, vel, 794 00:46:59,890 --> 00:47:03,790 tusenvis, hvis ikke titusenvis av mennesker, har sett på Clang, har 795 00:47:03,790 --> 00:47:07,160 så på sine linjer med kode og sa, all right, det er ikke noe dårlig her. 796 00:47:07,160 --> 00:47:10,680 Selvfølgelig er det ingen som gjør noe dette skadelig. 797 00:47:10,680 --> 00:47:15,780 >> Men hva er klang i seg selv, som, hva om jeg kompilere Clang? 798 00:47:15,780 --> 00:47:20,900 Hva om jeg har noen kompilator som kompilerer Clang som setter inn Clang 799 00:47:20,900 --> 00:47:25,610 denne spesielle hack som sier, all right, når jeg kompilere Clang, deretter 800 00:47:25,610 --> 00:47:31,290 kjørbar Jeg får bør spesielt se innsiden av påloggingsprogrammet og insert 801 00:47:31,290 --> 00:47:34,230 dette passordet, tilsvarer likemenn Dave er fantastisk? 802 00:47:34,230 --> 00:47:37,990 Så husk at kompilatoren selv må kompileres på noen punkt. 803 00:47:37,990 --> 00:47:42,810 Så hvis det du velger å kompilere Clang med, er i seg selv skadelig, så du 804 00:47:42,810 --> 00:47:45,580 kan være skrudd hele vei 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 en ikonisk bilde. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie er på høyre side. 808 00:47:55,470 --> 00:47:58,740 Han er en stor - 809 00:47:58,740 --> 00:48:03,640 ganske mye skrev C. Så du kan takke ham for denne klassen. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson er på venstre side. 811 00:48:04,840 --> 00:48:07,780 De to av dem i utgangspunktet skrev UNIX. 812 00:48:07,780 --> 00:48:10,140 Vel, de var store bidragsytere i UNIX. 813 00:48:10,140 --> 00:48:11,310 Det var noen andre. 814 00:48:11,310 --> 00:48:16,240 Så Ken Thompson, på et tidspunkt, han vinner Turing Award. 815 00:48:16,240 --> 00:48:20,860 Og Turing-prisen, jeg har alltid hørt det refereres til på denne måten, er det 816 00:48:20,860 --> 00:48:23,100 Nobelprisen i informatikk. 817 00:48:23,100 --> 00:48:27,500 >> Så på Turing Award, må han gi sin takketale. 818 00:48:27,500 --> 00:48:31,790 Og han gir dette svært berømte tale nå, heter Reflections on Klarering 819 00:48:31,790 --> 00:48:35,620 Trust, som vi har knyttet TIL på kurset hjemmeside. 820 00:48:35,620 --> 00:48:41,670 Og i denne talen, sier han, all right, så jeg skrev UNIX, og nå er alle av 821 00:48:41,670 --> 00:48:43,320 du folk bruker UNIX. 822 00:48:43,320 --> 00:48:46,960 Husk nå i dag at Linux er en direkte etterkommer av UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X bruker direkte UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows gjør ikke så mye, men mye av ideer ble tatt fra UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Så han går opp på scenen og sier, all right, skrev jeg UNIX. 826 00:48:59,220 --> 00:49:03,940 Og bare så dere vet, jeg er stand til å logge inn hver 827 00:49:03,940 --> 00:49:05,590 eneste en av datamaskinene. 828 00:49:05,590 --> 00:49:14,280 Siden jeg sette en av disse spesielt hvis x lik lik Ken Thomson er kjempebra, 829 00:49:14,280 --> 00:49:16,350 så jeg får lov til å logge inn. 830 00:49:16,350 --> 00:49:18,370 Så folk er som, vel, Hvordan gjorde du det? 831 00:49:18,370 --> 00:49:21,090 Vi så på login-programmet og ingenting er der. 832 00:49:21,090 --> 00:49:24,700 Han er som, vel, endret jeg kompilatoren å logge på påloggingsprogrammet 833 00:49:24,700 --> 00:49:30,490 slik at login programmet nå vil ha at x er lik lik Ken Thompson 834 00:49:30,490 --> 00:49:31,700 er kjempebra. 835 00:49:31,700 --> 00:49:33,120 >> Og de sier, vel, det er ikke sant. 836 00:49:33,120 --> 00:49:35,740 Vi ser på kompilatoren, og kompilatoren ikke har noen linjer av 837 00:49:35,740 --> 00:49:36,400 kode sånn. 838 00:49:36,400 --> 00:49:40,540 Han er liksom, OK, men hva er du kompilering kompilatoren med? 839 00:49:40,540 --> 00:49:44,810 Og de tror, ​​og han er, som, vel, Jeg er den som ga deg kompilatoren 840 00:49:44,810 --> 00:49:50,580 du bruker å kompilere kompilatoren, så du lage en kompilator, som 841 00:49:50,580 --> 00:49:56,390 i seg selv er skadelig, og vil bryte login programmet. 842 00:49:56,390 --> 00:49:59,360 Så i utgangspunktet, på det tidspunktet, det er ingen måte du kan se på kilde 843 00:49:59,360 --> 00:50:02,450 koden til login-programmet å se hva som er galt. 844 00:50:02,450 --> 00:50:04,220 Du kunne ikke engang se på kildekoden til kompilatoren 845 00:50:04,220 --> 00:50:06,790 å se hva som er galt. 846 00:50:06,790 --> 00:50:11,940 >> Du ville trenge for å se på maskinen kode, faktisk binær av 847 00:50:11,940 --> 00:50:16,760 kompilert kompilatoren å se, vente, disse linjer med kode skal ikke være her. 848 00:50:16,760 --> 00:50:22,130 Men Ken Thompson tok det ett skritt videre og sa, vel, det er 849 00:50:22,130 --> 00:50:25,980 disse spesielle programmer som faktisk hjelpe deg lese binære av programmer, 850 00:50:25,980 --> 00:50:29,340 og så hvis noen har brukt det programmet til lese binære, ville de se disse 851 00:50:29,340 --> 00:50:30,490 linjer med kode. 852 00:50:30,490 --> 00:50:34,020 Han endret disse programmene til å si, all Greit, hvis du ser på den 853 00:50:34,020 --> 00:50:38,460 kompilatoren, ikke vis denne spesielle sett av binær. 854 00:50:38,460 --> 00:50:42,830 >> Så da må du ta det et skritt videre og i utgangspunktet, som kunne ha 855 00:50:42,830 --> 00:50:46,210 tatt flere nivåer av indirekte, og på et tidspunkt, er ingen egentlig 856 00:50:46,210 --> 00:50:47,990 skal sjekke. 857 00:50:47,990 --> 00:50:52,590 Så moralen i historien er, du er ikke kommer til å skrive 858 00:50:52,590 --> 00:50:54,340 Klang i denne klassen. 859 00:50:54,340 --> 00:50:57,020 Du kommer til å bruke klatre Clang mye i denne klassen. 860 00:50:57,020 --> 00:51:00,490 For alt du vet, er Clang en ondsinnet program som er sabotere hver 861 00:51:00,490 --> 00:51:03,520 enkelt program du noen gang har satt sammen. 862 00:51:03,520 --> 00:51:08,206 Og for å forlate deg på at svært illevarslende oppmerksom, se deg på onsdag. 863 00:51:08,206 --> 00:51:10,030 >> [APPLAUSE] 864 00:51:10,030 --> 00:51:12,935 >> SPEAKER 2: Ved neste CS50. 865 00:51:12,935 --> 00:51:14,580 >> SPEAKER 3: Tror ikke du tør si det. 866 00:51:14,580 --> 00:51:15,930 Du kan gjøre dette. 867 00:51:15,930 --> 00:51:19,440 Du har gjort dette før, kan du gjøre dette i dag, kan du gjøre dette i morgen. 868 00:51:19,440 --> 00:51:20,930 Du har gjort dette i årevis. 869 00:51:20,930 --> 00:51:22,790 Bare gå opp der og gjøre dette. 870 00:51:22,790 --> 00:51:24,310 Du kan gjøre dette. 871 00:51:24,310 --> 00:51:26,102 >> [Musikk spilles]