1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [Redare a muzicii] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: În regulă. 4 00:00:12,100 --> 00:00:15,620 Deci, primul lucru pe care în primul rând, de film de la un chip familiar. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [VIDEO PLAYBACK] 7 00:00:22,560 --> 00:00:23,370 >> -În regulă. 8 00:00:23,370 --> 00:00:27,150 Aceasta este CS50, iar acest lucru este începutul săptămânii trei. 9 00:00:27,150 --> 00:00:29,980 Îmi pare rău, nu am putut fi acolo cu tine azi, dar permiteți-mi să introducă 10 00:00:29,980 --> 00:00:32,880 CS50 proprii Rob Boden. 11 00:00:32,880 --> 00:00:33,872 >> [END VIDEO PLAYBACK] 12 00:00:33,872 --> 00:00:39,340 >> [Aplauze și urale] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: filmografia în că video este fantastic. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Bine. 16 00:00:47,770 --> 00:00:50,960 Deci, în primul rând, există un alt prânz. 17 00:00:50,960 --> 00:00:52,330 E mâine la 01:15. 18 00:00:52,330 --> 00:00:54,480 Nu există nici un prânz vineri. 19 00:00:54,480 --> 00:00:55,810 Este cu Quora. 20 00:00:55,810 --> 00:01:00,190 Și Tommy nu e aici încă, dar unul dintre oamenii de acolo este fostul CF cap, 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Deci, el e un tip amuzant. 23 00:01:02,730 --> 00:01:04,819 Ar trebui să vii. 24 00:01:04,819 --> 00:01:05,900 >> Bine. 25 00:01:05,900 --> 00:01:11,360 Deci, săptămâna trecută, am început de rupere în afară cu privire la ceea ce este într-adevăr un șir. 26 00:01:11,360 --> 00:01:14,830 Ne-am cunoscut de la început că este o secvență de caractere. 27 00:01:14,830 --> 00:01:18,130 Dar săptămâna trecută, ne-am afundat în faptul că ceea ce este de fapt o secvență de 28 00:01:18,130 --> 00:01:22,110 personaje, ei bine, acum avem tablouri de caractere. 29 00:01:22,110 --> 00:01:26,450 Și știm că un șir de caractere, este o matrice de caractere, la sfârșitul foarte, 30 00:01:26,450 --> 00:01:30,920 avem acest octet special nul, acest backslash 0, care indică sfârșitul 31 00:01:30,920 --> 00:01:32,230 șir. 32 00:01:32,230 --> 00:01:36,970 >> Și astfel un șir este o matrice de caractere, dar putem avea mai mult 33 00:01:36,970 --> 00:01:39,530 doar o serie de caractere, putem avea o serie de orice 34 00:01:39,530 --> 00:01:40,890 tip de lucru pe care îl dorim. 35 00:01:40,890 --> 00:01:51,570 Deci, dacă vă amintiți de săptămâna trecută, Program de vârstele, care a introdus David 36 00:01:51,570 --> 00:01:53,560 foarte repede. 37 00:01:53,560 --> 00:01:57,010 Deci, primul lucru pe care am de gând să faceți este să cere utilizatorului pentru un întreg, 38 00:01:57,010 --> 00:01:58,800 numărul de persoane în cameră. 39 00:01:58,800 --> 00:02:01,260 După ce vom avea ca întreg, vom declara o matrice. 40 00:02:01,260 --> 00:02:02,890 Observați această sintaxă suport. 41 00:02:02,890 --> 00:02:04,540 Ai de gând să te obișnuiești cu asta. 42 00:02:04,540 --> 00:02:09,430 >> Deci, vom declara o serie de numere întregi numit vârstele, și există n 43 00:02:09,430 --> 00:02:12,080 numere întregi, în această matrice. 44 00:02:12,080 --> 00:02:16,480 Deci, acest model chiar aici, acest 4 int i este egal cu 0, i este mai mic decât n, i plus 45 00:02:16,480 --> 00:02:20,580 plus, care este, de asemenea, va fi un model că te foarte folosit pentru a. 46 00:02:20,580 --> 00:02:24,000 Pentru că e destul de mult cum esti întotdeauna va repeta peste matrice. 47 00:02:24,000 --> 00:02:26,330 Deci, amintiți-vă că n este lungime de matrice noastre. 48 00:02:26,330 --> 00:02:32,120 Și atât de aici, suntem în mod repetat cer de la vârsta de persoane i în cameră. 49 00:02:32,120 --> 00:02:36,640 >> După aceasta, vom merge în jos, și pentru orice motiv arbitrar, noi atunci 50 00:02:36,640 --> 00:02:40,220 imprima cat de vechi au de gand pentru a fi un an de acum. 51 00:02:40,220 --> 00:02:49,980 Și rularea acestui program, să face vârstele, dot vârstele slash. 52 00:02:49,980 --> 00:02:53,010 Deci, numărul de persoane în cameră, să spunem că sunt trei. 53 00:02:53,010 --> 00:02:59,880 Și spune, prima persoană este de 13, următor este de 26, iar ultimul este de 30. 54 00:02:59,880 --> 00:03:05,080 Deci, atunci se va repeta pe cele trei oameni, imprima 14, 27, și 31. 55 00:03:05,080 --> 00:03:16,060 >> Deci, amintiți-vă că, atunci când ne-am declara o matrice de dimensiune n, indicii din care 56 00:03:16,060 --> 00:03:19,950 matrice, matrice a valorilor și Indicii 0, 1, 2, tot drumul 57 00:03:19,950 --> 00:03:21,680 până la n minus 1. 58 00:03:21,680 --> 00:03:26,255 Așa că atunci când am spus că erau trei persoane in camera, și am pus aici 59 00:03:26,255 --> 00:03:29,850 prima iterație prin aceasta buclă, i se va fi 0. 60 00:03:29,850 --> 00:03:31,650 Deci, în index 0. 61 00:03:31,650 --> 00:03:34,540 Suntem atribuirea primul varsta utilizatorul introduce. 62 00:03:34,540 --> 00:03:38,870 Apoi, în cea următoare, vom intra în n doua utilizatorul introduce, și în 63 00:03:38,870 --> 00:03:40,580 alături de două, ultimele n. 64 00:03:40,580 --> 00:03:44,200 >> Deci, observăm că o serie de dimensiuni trei nu are nimic 65 00:03:44,200 --> 00:03:46,040 în index trei. 66 00:03:46,040 --> 00:03:49,036 Acest lucru nu este valabil. 67 00:03:49,036 --> 00:03:50,250 Bine. 68 00:03:50,250 --> 00:03:55,136 Deci, merge înapoi aici. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Deci, acum că ne-am ocupat cu tablouri, avem o familiaritate. 71 00:04:01,590 --> 00:04:03,780 Acum vom trece la comanda argumente de linie, care urmează să fie 72 00:04:03,780 --> 00:04:05,890 destul de relevante pentru acest set de probleme. 73 00:04:05,890 --> 00:04:09,670 >> Deci, până acum, ori de câte ori ai a declarat funcția principală, ne-am 74 00:04:09,670 --> 00:04:11,230 a declarat nule principal Int. 75 00:04:11,230 --> 00:04:14,070 Deci, gol înseamnă doar că noi nu se trece nici o 76 00:04:14,070 --> 00:04:16,440 argumente pentru această funcție. 77 00:04:16,440 --> 00:04:19,190 Acum vom vedea ca principal poate dura câteva argumente. 78 00:04:19,190 --> 00:04:22,470 Aici noi le numim int argc și paranteze argv șir. 79 00:04:22,470 --> 00:04:26,930 Parantezele, încă o dată, indicând că avem de-a face cu tablouri. 80 00:04:26,930 --> 00:04:31,850 Deci, aici, între paranteze șir argv, suntem de-a face cu o serie de siruri de caractere. 81 00:04:31,850 --> 00:04:35,360 Astfel argc, care va indica cât de multe argumente ne-am 82 00:04:35,360 --> 00:04:37,580 trecut la acest program. 83 00:04:37,580 --> 00:04:46,050 Și pentru a vedea ce înseamnă că, Să închidem acest lucru. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Deci, până acum, ne-am alerga în fiecare program ca vârstele slash dot. 86 00:04:50,790 --> 00:04:55,250 Putem, de asemenea, la linia de comandă, pe lângă trece argumente, astfel termen, comanda 87 00:04:55,250 --> 00:04:56,550 argumente în linia. 88 00:04:56,550 --> 00:04:59,760 Deci, primul argument, salut lume. 89 00:04:59,760 --> 00:05:03,350 Deci, aici, argc ar fi trei. 90 00:05:03,350 --> 00:05:07,720 Este numărul de argumentelor la linia de comandă. 91 00:05:07,720 --> 00:05:12,840 Argc este întotdeauna cel puțin 1, din punct slash vârstele, în sine, contează ca una din 92 00:05:12,840 --> 00:05:14,490 argumentele din linia de comandă. 93 00:05:14,490 --> 00:05:17,010 >> Apoi, salut este primul. 94 00:05:17,010 --> 00:05:20,460 Dacă vârstele slash punct este de grad zero, atunci salut este primul, iar lumea este 95 00:05:20,460 --> 00:05:22,830 al doilea argument linie de comandă. 96 00:05:22,830 --> 00:05:29,490 Deci, argv șir, vom vedea, contine siruri de caractere, slash punct 97 00:05:29,490 --> 00:05:33,830 vârstele, salut, și lumea. 98 00:05:33,830 --> 00:05:38,945 Și, la cererea lui David, vom pentru a reda un clip video de introducere asta. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [VIDEO PLAYBACK] 101 00:05:43,890 --> 00:05:46,240 >> -Până acum în programe care le-am scris, ne-am declara 102 00:05:46,240 --> 00:05:48,500 principal void main int. 103 00:05:48,500 --> 00:05:51,170 Și în tot acest timp, acest gol a pur și simplu a fost precizând că 104 00:05:51,170 --> 00:05:54,430 program nu se ia nici o argumente în linia de comandă. 105 00:05:54,430 --> 00:05:57,750 Cu alte cuvinte, atunci când un utilizator execută o Programul, el sau ea poate oferi comandă 106 00:05:57,750 --> 00:06:01,710 argumente în linia de scris suplimentare cuvinte sau fraze, după programului 107 00:06:01,710 --> 00:06:03,000 numele la prompt. 108 00:06:03,000 --> 00:06:06,550 >> Ei bine, dacă vrei programul de ia argumente în linia de comandă, unul sau 109 00:06:06,550 --> 00:06:10,540 mai multe astfel de cuvinte, avem nevoie pentru a înlocui anula cu o pereche de argumente. 110 00:06:10,540 --> 00:06:12,200 Deci, haideți să facem asta. 111 00:06:12,200 --> 00:06:15,750 Includeți CS50.h. 112 00:06:15,750 --> 00:06:19,360 Includeți io.h. standard, 113 00:06:19,360 --> 00:06:20,760 Int main. 114 00:06:20,760 --> 00:06:26,330 Și acum, în loc de gol, am de gând să specifica un int numit argc, și o 115 00:06:26,330 --> 00:06:28,780 matrice de siruri de caractere, numite argv. 116 00:06:28,780 --> 00:06:31,820 Acum, argc și argv sunt pur și simplu convenții. 117 00:06:31,820 --> 00:06:34,000 >> Am putea-am numit aceste argumente cele mai multe orice vrem. 118 00:06:34,000 --> 00:06:37,630 Dar ceea ce este important este faptul că argc este un int deoarece, prin definiție, este 119 00:06:37,630 --> 00:06:41,360 O să conțină numărul de argument, numărul de cuvinte în total pe care 120 00:06:41,360 --> 00:06:43,380 utilizator a tastat la promptul lui sau a ei. 121 00:06:43,380 --> 00:06:47,910 argv, între timp, vector argument, este va fi de fapt o matrice de stocare 122 00:06:47,910 --> 00:06:52,020 toate cuvintele pe care utilizatorul are tastat la promptul lui sau a ei. 123 00:06:52,020 --> 00:06:54,500 >> Să continuăm să facem ceva acum cu unul sau mai mulți dintre aceștia 124 00:06:54,500 --> 00:06:55,660 argumente în linia de comandă. 125 00:06:55,660 --> 00:07:00,070 În special, să mergem mai departe și de imprimare indiferent de cuvânt tipurile de utilizatori 126 00:07:00,070 --> 00:07:03,960 după numele programului la prompt. 127 00:07:03,960 --> 00:07:04,730 Deschis suport. 128 00:07:04,730 --> 00:07:06,240 Aproape suport. 129 00:07:06,240 --> 00:07:10,510 Printf la suta s backslash și virgulă. 130 00:07:10,510 --> 00:07:14,550 Și acum am nevoie să spun printf ce valoare să conectați în acel substituent. 131 00:07:14,550 --> 00:07:18,600 Vreau ca primul cuvânt pe care utilizatorul are tastat după numele programului, 132 00:07:18,600 --> 00:07:23,130 și așa am de gând pentru a specifica argv suport 1, aproape 133 00:07:23,130 --> 00:07:24,830 paranteze, punct și virgulă. 134 00:07:24,830 --> 00:07:27,290 >> Acum, de ce suport 1 și nu suport 0? 135 00:07:27,290 --> 00:07:30,990 Ei bine, se pare, stocate automat în argv 0 va fi 136 00:07:30,990 --> 00:07:32,620 Numele real program. 137 00:07:32,620 --> 00:07:36,180 Deci, primul cuvânt care utilizatorul tastează după numele programului este, de 138 00:07:36,180 --> 00:07:38,990 convenție, va fi stocate în argv 1. 139 00:07:38,990 --> 00:07:42,380 Hai acum compila și rula acest program. 140 00:07:42,380 --> 00:07:47,780 >> Face argv 0, punct slash argv 0. 141 00:07:47,780 --> 00:07:50,520 Și acum un cuvânt ca salut. 142 00:07:50,520 --> 00:07:51,670 Enter. 143 00:07:51,670 --> 00:07:53,520 Și acolo l-am avea, salut. 144 00:07:53,520 --> 00:07:55,750 >> [END VIDEO PLAYBACK] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: În regulă. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Închideți asta. 148 00:08:01,230 --> 00:08:16,730 Deci, a lua o privire la acest program care am introdus doar la noi, ei bine, doar 149 00:08:16,730 --> 00:08:24,710 pentru a arăta, dacă vom imprima argv 0, face, acum ceea ce este, argv 0, punct slash argv 0. 150 00:08:24,710 --> 00:08:30,440 Deci, cum era de așteptat, este imprimarea Numele programului, deoarece argv 0 este 151 00:08:30,440 --> 00:08:32,970 întotdeauna o să fie numele programului. 152 00:08:32,970 --> 00:08:35,640 Dar hai sa facem ceva o pic mai interesant. 153 00:08:35,640 --> 00:08:42,080 >> Deci, în setul problemă, veți fi a introdus la această funcție, atoi. 154 00:08:42,080 --> 00:08:44,440 Deci, ce vom folosi pentru atoi? 155 00:08:44,440 --> 00:08:48,550 Asta va converti o șir la un număr întreg. 156 00:08:48,550 --> 00:08:53,280 Deci, dacă am trece șir, unul, doi, trei, pentru atoi, care va converti că 157 00:08:53,280 --> 00:08:56,910 la numărul întreg, unul, doi, trei. 158 00:08:56,910 --> 00:09:01,480 Așa că am de gând pentru a converti primul argument linie de comandă pentru un număr întreg, 159 00:09:01,480 --> 00:09:05,690 și apoi pur și simplu imprimați că întreg. 160 00:09:05,690 --> 00:09:09,680 >> Deci, practic, suntem un fel de reimplementing getint, drepți 161 00:09:09,680 --> 00:09:12,350 întreg este înscris la comanda linie în loc de program 162 00:09:12,350 --> 00:09:14,560 interactiv. 163 00:09:14,560 --> 00:09:23,170 Deci, ceea ce face argv 0, hai sa facem o aici, și închide asta. 164 00:09:23,170 --> 00:09:27,670 Deci, rulează argv 0, și să introduceți întreg, unu, doi, trei patru unu doi. 165 00:09:27,670 --> 00:09:30,840 Asa ca va tipări un număr întreg, un doi, trei, patru unu doi. 166 00:09:30,840 --> 00:09:35,500 Există unele subtilități de atoi că se va opri pese de nimic 167 00:09:35,500 --> 00:09:39,040 dincolo de un caracter numeric valabil, dar asta nu contează. 168 00:09:39,040 --> 00:09:42,870 >> Deci, ce crezi că se întâmplă dacă am face acest lucru? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Eroare de segmentare. 171 00:09:47,050 --> 00:09:50,410 Deci, de ce este asta? 172 00:09:50,410 --> 00:09:56,060 Dacă te uiți înapoi la programul nostru, suntem conversie argv 1, primul argument 173 00:09:56,060 --> 00:09:59,610 după numele programului, la un număr întreg. 174 00:09:59,610 --> 00:10:03,350 Dar nu există nici un argument trecut după numele programului. 175 00:10:03,350 --> 00:10:08,060 Deci, aici, vom vedea că acest lucru este un buggy Programul, din moment ce, în cazul în care vom încerca să-l rulați 176 00:10:08,060 --> 00:10:10,530 fără nici un argument, se va prăbuși pur și simplu. 177 00:10:10,530 --> 00:10:16,950 >> Deci, un alt model comun, veți vedea este ceva de genul, dacă argc este mai puțin 178 00:10:16,950 --> 00:10:21,100 mult de două, indicând că nu a existat cel puțin numele programului și A 179 00:10:21,100 --> 00:10:29,100 primul argument, atunci vom face ceva ca printf, nu suficient 180 00:10:29,100 --> 00:10:31,190 argumente în linia de comandă. 181 00:10:31,190 --> 00:10:33,170 Asta e, probabil, unul bun pentru a imprima, este, probabil, ceva, cum ar fi 182 00:10:33,170 --> 00:10:35,440 ar trebui să introduceți un număr întreg la linia de comandă. 183 00:10:35,440 --> 00:10:37,450 Voi termina acolo. 184 00:10:37,450 --> 00:10:39,600 Și apoi să se întoarcă 1. 185 00:10:39,600 --> 00:10:44,740 Deci, amintim că, la sfârșitul nostru Programul, dacă ne-am întoarce 0, ca un fel de 186 00:10:44,740 --> 00:10:47,060 indică succesul. 187 00:10:47,060 --> 00:10:50,940 Și principal, de asemenea, în mod automat returneaza 0 daca nu. 188 00:10:50,940 --> 00:10:55,800 >> Deci, aici, suntem Revenirea 1 pentru a indica că nu este de succes. 189 00:10:55,800 --> 00:11:01,000 Și puteți reveni tot ce vrei, doar, 0 indică succes, și 190 00:11:01,000 --> 00:11:03,390 orice altceva indică eșec. 191 00:11:03,390 --> 00:11:04,855 Deci, haideți să ruleze această versiune de lucruri. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Deci, acum, dacă nu introduceți o linie de comandă argument, se va spune în mod corect 194 00:11:16,600 --> 00:11:18,290 ne, nu suficient de linie de comandă. 195 00:11:18,290 --> 00:11:20,610 Nu a terminat fraza. 196 00:11:20,610 --> 00:11:24,950 Altfel, dacă am de fapt, trece unul, se poate finaliza programul. 197 00:11:24,950 --> 00:11:27,920 Deci, acesta este modul în care ar trebui să utilizați în argc Pentru a valida numărul de 198 00:11:27,920 --> 00:11:30,630 argumente în linia de comandă care sunt de fapt a trecut. 199 00:11:30,630 --> 00:11:39,360 >> Așa că haideți să facem acest program un pic mai mult complicat, si uita-te la a doua 200 00:11:39,360 --> 00:11:42,180 repetare a lucrurilor. 201 00:11:42,180 --> 00:11:46,310 Deci, acum, suntem nu doar de imprimare Primul argument linie de comandă. 202 00:11:46,310 --> 00:11:51,210 Aici, suntem iterarea de la egal la egal i int 0, i este mai mică de argc, i plus 203 00:11:51,210 --> 00:11:55,280 plus, și de imprimare argv, indicele i. 204 00:11:55,280 --> 00:11:59,300 Deci acest model, din nou, acest lucru este la fel model ca și mai înainte, cu excepția loc 205 00:11:59,300 --> 00:12:02,600 de asteptare variabila n, suntem folosind argc. 206 00:12:02,600 --> 00:12:09,520 >> Deci, acest lucru este iterarea peste fiecare index în matrice, și tipărirea fiecărei 207 00:12:09,520 --> 00:12:11,910 element din acea matrice. 208 00:12:11,910 --> 00:12:20,300 Și astfel, atunci când vom rula acest program, ei bine, Nu am intra nici o linie de comandă 209 00:12:20,300 --> 00:12:22,540 argumente, așa că doar amprentele numele programului. 210 00:12:22,540 --> 00:12:26,053 Dacă intru într-o grămadă de lucruri, voi imprima o, fiecare pe o linie proprie. 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 Așa că haideți să facem un pas mai departe. 214 00:12:34,770 --> 00:12:38,890 Și în loc de a imprima fiecare argument pe o linie proprie, să imprimați fiecare 215 00:12:38,890 --> 00:12:42,590 caracter de fiecare argument pe o linie proprie. 216 00:12:42,590 --> 00:12:46,700 Deci, amintiți-vă că este argv o matrice de siruri de caractere. 217 00:12:46,700 --> 00:12:50,960 Deci, ce este un șir de caractere, dar o serie de caractere? 218 00:12:50,960 --> 00:12:57,140 Deci asta înseamnă că argv este într-adevăr o serie de o serie de caractere. 219 00:12:57,140 --> 00:13:04,920 Deci, profitând de faptul că, să ignore acest lucru pentru acum. 220 00:13:04,920 --> 00:13:08,190 Să ia în considerare doar șir argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Deci, dacă vrem să aducem fiecare personaj de argv 0 pe o linie proprie, atunci vreau 222 00:13:14,170 --> 00:13:19,500 pentru a face modelul suntem obișnuiți, i este mai mică decât lungimea de matrice, 223 00:13:19,500 --> 00:13:23,990 care aici, este strlen de, care este nu ceea ce vreau să fac, string 224 00:13:23,990 --> 00:13:26,450 e egal cu 0 argv. 225 00:13:26,450 --> 00:13:30,390 Deci, i este mai mică decât lungimea noastre matrice, care în acest caz este o matrice 226 00:13:30,390 --> 00:13:34,410 de caractere, i plus plus. 227 00:13:34,410 --> 00:13:41,040 Și astfel, așa cum am văzut săptămâna trecută, este ideal dacă ne-am muta că strlen afara 228 00:13:41,040 --> 00:13:45,210 afecțiunii, deoarece n va fi adăugarea strlen de s de fiecare dată când mergem 229 00:13:45,210 --> 00:13:47,720 prin bucla, și este nu o să se schimbe. 230 00:13:47,720 --> 00:13:50,230 Deci, vom egal cu n aici set. 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 Deci, acum, suntem iterarea peste fiecare index în matrice. 234 00:14:01,320 --> 00:14:05,630 Și așa, dacă vrem să imprimați fiecare personaj în acea matrice, suta c este 235 00:14:05,630 --> 00:14:06,880 steagul ne-o dorim pentru a utiliza de caractere. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 Și acum un i suport va fi șir, caractere indicele i, astfel încât în ​​cazul în care 238 00:14:19,770 --> 00:14:20,970 șir au fost salut. 239 00:14:20,970 --> 00:14:27,530 apoi s 0 va fi h, s suport 1 va fi e, și așa mai departe. 240 00:14:27,530 --> 00:14:30,800 >> Deci, acum vrem să combine aceste două lucruri. 241 00:14:30,800 --> 00:14:35,440 Vrem să imprimați fiecare personaj de fiecare argument linie de comandă. 242 00:14:35,440 --> 00:14:38,950 Deci, vom avea o imbricate pentru buclă. 243 00:14:38,950 --> 00:14:47,480 Și în mod convențional, primul contor este i, următorul va fi j, n 244 00:14:47,480 --> 00:14:54,450 va fi strlen de argv i, i este mai mică decât n, i plus plus. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 Și acum, în loc de imprimare argv i, astfel argv suport i se va indexa - 247 00:15:06,870 --> 00:15:14,280 care va fi linia de comandă i-lea argument, argv i, j se va 248 00:15:14,280 --> 00:15:16,925 fi caracterul j de argumentul i-lea. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Voi scăpa de asta aici, acum din moment ce ne-am pus-o în acea buclă. 251 00:15:24,810 --> 00:15:33,900 Deci, este echivalent cu egali string s argv i, și apoi s suport j. 252 00:15:33,900 --> 00:15:36,980 >> Ei bine, nu avem nevoie să declare aceasta s variabil. 253 00:15:36,980 --> 00:15:44,530 În schimb, vom combina doar acestea două în ceea ce am avut, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> SPEAKER 1: [inaudibil]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: Good apel. 257 00:15:49,680 --> 00:15:52,936 Deci, acest lucru este rupt. 258 00:15:52,936 --> 00:15:55,510 Dacă am de fapt fugit, ne-ar au realizat acest lucru. 259 00:15:55,510 --> 00:16:01,210 Astfel încât contorul îmi pasă în această special pentru 260 00:16:01,210 --> 00:16:05,410 buclă este j, iterator. 261 00:16:05,410 --> 00:16:08,560 Deci, s-ar fi rula în probleme, probabil o buclă infinită, dacă ne-am 262 00:16:08,560 --> 00:16:09,540 nu au stabilit asta. 263 00:16:09,540 --> 00:16:12,220 De aceea, suntem, de asemenea, vorbim despre depanare ziua de azi. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Deci, haideți să rula acest program. 266 00:16:15,240 --> 00:16:21,200 Și să adăugați de fapt un printf separat chiar aici, care va imprima doar 267 00:16:21,200 --> 00:16:27,480 o altă linie, deoarece acest lucru înseamnă că, atunci când ne-am rula programul, nu va mai fi un gol 268 00:16:27,480 --> 00:16:31,830 linie între fiecare caracter de fiecare argument linie de comandă. 269 00:16:31,830 --> 00:16:33,448 Ei bine, vom vedea ce înseamnă asta. 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 Am unele bug. 273 00:16:39,870 --> 00:16:42,860 Eroare implicit, declararea funcția de bibliotecă strlen. 274 00:16:42,860 --> 00:16:51,630 >> Deci, merge înapoi în programul nostru, am a uitat să includă hash string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 Astfel string.h va fi fișier header care declară 277 00:16:57,730 --> 00:16:58,980 funcția strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, se compilează. 280 00:17:06,060 --> 00:17:09,109 Acum, hai să-l rulați. 281 00:17:09,109 --> 00:17:10,930 Deci, doar asta. 282 00:17:10,930 --> 00:17:17,790 Se va imprima nostru numele programului, salut lume. 283 00:17:17,790 --> 00:17:23,510 O să imprimați fiecare lucru, fiecare caracter, pe o linie proprie. 284 00:17:23,510 --> 00:17:24,540 OK. 285 00:17:24,540 --> 00:17:30,625 >> Așa că haideți să ia de fapt acest un pas mai departe. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 Și în loc de a folosi string.h, să cred despre modul în care ne-ar pune în aplicare propria noastră 288 00:17:39,700 --> 00:17:41,420 Funcția strlen. 289 00:17:41,420 --> 00:17:45,600 Deci, voi da imediat o semnătură funcție. 290 00:17:45,600 --> 00:17:52,900 Așa că haideți să numim în my_strlen, și este de gând să ia un șir ca un argument, 291 00:17:52,900 --> 00:17:57,220 și ne așteptăm să se întoarcă lungime de acel șir. 292 00:17:57,220 --> 00:18:03,430 Deci, unde e tipul ala? 293 00:18:03,430 --> 00:18:04,990 Da. 294 00:18:04,990 --> 00:18:06,740 OK. 295 00:18:06,740 --> 00:18:12,900 Deci, amintiți-vă de la diapozitivul anterior că a fost, de asemenea, de săptămâna trecută, că o 296 00:18:12,900 --> 00:18:18,890 tablou de caractere, ei bine, un șir de caractere, deci haideți să spun acest lucru este șir s nostru. 297 00:18:18,890 --> 00:18:29,870 Deci, dacă s este șirul, salut, apoi, H-E-L-L-O, în memorie, care va 298 00:18:29,870 --> 00:18:35,610 fie, iar apoi acest backslash 0 caracter. 299 00:18:35,610 --> 00:18:39,170 >> Deci, cum putem obține lungimea de s? 300 00:18:39,170 --> 00:18:43,190 Ei bine, truc este în căutarea pentru acest criticilor camuflate 0 caracter, acest nul 301 00:18:43,190 --> 00:18:44,380 terminator. 302 00:18:44,380 --> 00:18:50,270 Deci, algoritmul se întâmplă să fie ceva de genul puțini 303 00:18:50,270 --> 00:18:51,510 suficient de caractere care - 304 00:18:51,510 --> 00:18:56,180 haideți să avem această mână reprezintă unele contra, să numim această lungime int. 305 00:18:56,180 --> 00:19:00,060 Deci, pornind de aici, suntem O să itera peste șir nostru. 306 00:19:00,060 --> 00:19:04,100 >> Deci, primul caracter, este H, și nu este înapoi slash 0, așa 307 00:19:04,100 --> 00:19:05,170 lungimea este 1. 308 00:19:05,170 --> 00:19:08,050 Repeta la caracterul următor, E, și nu este backslash 0. 309 00:19:08,050 --> 00:19:09,630 Lungimea este de 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 Și, în sfârșit, ajungem la backslash 0, și astfel încât mijloace, ei bine, 314 00:19:16,690 --> 00:19:17,780 acest șir este de peste. 315 00:19:17,780 --> 00:19:20,130 Deci, haideți să se întoarcă 5. 316 00:19:20,130 --> 00:19:33,630 >> Deci, de fapt, de punere în aplicare, care, în primul rând, n lungime mea este egal cu 0, mâna mea dreaptă. 317 00:19:33,630 --> 00:19:36,088 Și vom repeta - 318 00:19:36,088 --> 00:19:38,000 >> SPEAKER 1: [inaudibil] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Oh, trage. 320 00:19:38,640 --> 00:19:39,870 Bun apel. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Deci, n lungime este egal cu 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Deci, acum, în timp ce lungimea s nu egal și apoi, backslash 0. 325 00:19:58,310 --> 00:20:04,660 Deci, amintiți-vă, aceasta backslash 0, aceasta este o caracterul real, și se indică 326 00:20:04,660 --> 00:20:05,820 sfârșitul șirului. 327 00:20:05,820 --> 00:20:09,850 La fel ca și, de asemenea, backslash n este un caracter real. 328 00:20:09,850 --> 00:20:14,040 Backslash 0 se va indica sfârșitul șir nostru. 329 00:20:14,040 --> 00:20:15,414 Nu vreau să pui acolo. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 Și, în timp ce s indexate de lungime nu este egală cu terminatorul null, atunci 332 00:20:25,620 --> 00:20:27,130 suntem doar de gând să incrementa lungime. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Deci, la sfârșitul programului nostru, Lungimea este în cele din urmă va 335 00:20:34,880 --> 00:20:37,610 fie de 5 în acest caz. 336 00:20:37,610 --> 00:20:39,210 Și lungime vom returna doar. 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 Deci, acum, aici, eu nu fac face my_strlen. 340 00:20:48,290 --> 00:20:50,700 Să-l compilați pentru a vă asigura totul merge bine. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Fost eu in 2? 343 00:20:58,210 --> 00:21:00,565 Sau a fost o? 344 00:21:00,565 --> 00:21:01,940 Asta ar trebui să facă. 345 00:21:01,940 --> 00:21:02,690 Bine. 346 00:21:02,690 --> 00:21:08,490 Deci, aceasta este argv 2. 347 00:21:08,490 --> 00:21:11,585 Lucrează ca anticipat, deși a fost ca cea pe care am făcut-o în? 348 00:21:11,585 --> 00:21:15,060 349 00:21:15,060 --> 00:21:15,550 Da. 350 00:21:15,550 --> 00:21:16,760 OK. 351 00:21:16,760 --> 00:21:21,820 Această versiune de lucruri nu au avut linia nou printf după, dar 352 00:21:21,820 --> 00:21:22,910 nu se face nici o diferență. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 Astfel lucrat cum era de așteptat. 355 00:21:25,780 --> 00:21:34,750 >> Acum putem combina chiar și acest singur pas în plus, în cazul în care o notificare aici, ei bine, 356 00:21:34,750 --> 00:21:38,920 în primul rând, suntem hapsân strlen de argv i, iar apoi vom iterarea peste 357 00:21:38,920 --> 00:21:41,450 fiecare personaj în șir. 358 00:21:41,450 --> 00:21:47,480 Deci, în loc de a face asta, dacă am combina doar această logică de așteptare 359 00:21:47,480 --> 00:21:50,740 până când ne-am lovit backslash 0 corect în acest timp de buclă? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Deci, în timp ce repeta argv i, j nu nu egal backslash 0. 362 00:22:07,490 --> 00:22:10,680 Deci, haideți să-l ruleze mai întâi. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Bine. 365 00:22:21,180 --> 00:22:27,655 Deci, aici, această condiție se spune - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 Să clar că. 368 00:22:40,060 --> 00:22:49,140 Deci, acum, lăsați acest lucru să fie argv nostru. 369 00:22:49,140 --> 00:22:55,290 Așa că atunci când am fugit că programul înainte, argv este o matrice de siruri de caractere. 370 00:22:55,290 --> 00:23:03,100 Și așa, dacă am alerga cu punct argv slash 2, salut lume, atunci argv 371 00:23:03,100 --> 00:23:07,650 în sine este de lungime 3, pentru argv la zero, salut, și lumea. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> Și în interiorul fiecăruia dintre acești indici este, în sine o matrice, în cazul în care acest lucru va fi 374 00:23:19,660 --> 00:23:23,780 punct, acest lucru va fi slash, nu știu în cazul în care a fost direcția cea bună, am 375 00:23:23,780 --> 00:23:25,680 Nu cred că a fost. 376 00:23:25,680 --> 00:23:30,110 A-R-V bord, au nevoie de mai mult spațiu. 377 00:23:30,110 --> 00:23:32,570 Să taie în această matrice. 378 00:23:32,570 --> 00:23:38,230 Liniuță 0, și apoi backslash 0 A-R-V. 379 00:23:38,230 --> 00:23:43,160 Și apoi în dezordine va fi salut. 380 00:23:43,160 --> 00:23:45,910 Să spunem, H-E backslash 0. 381 00:23:45,910 --> 00:23:51,130 Și, în sfârșit, W-O backslash 0. 382 00:23:51,130 --> 00:23:59,730 >> Astfel algoritmul pe care tocmai am scris, imbricate pentru bucle, ce sunt 383 00:23:59,730 --> 00:24:07,321 face este că avem mai întâi contracara i și apoi j. 384 00:24:07,321 --> 00:24:15,206 Acest lucru ar fi mai ușor cu cod de pe ecran, Să ne întoarcem la aceasta. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 Astfel observa că i este iterator care este iterarea peste fiecare comandă 387 00:24:24,600 --> 00:24:25,610 argument linie. 388 00:24:25,610 --> 00:24:28,870 Și j este iterarea iterator peste fiecare personaj în care 389 00:24:28,870 --> 00:24:30,410 argument linie de comandă. 390 00:24:30,410 --> 00:24:46,755 Deci, ceea ce acest printf cel mai intim este de a face este, am 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, 6 0, dar acum, argv 0 7 se va 392 00:24:58,680 --> 00:25:00,670 egal backslash 0. 393 00:25:00,670 --> 00:25:05,730 >> Deci ne-am ieși din care pentru bucla, și acum i reiterează la 1. 394 00:25:05,730 --> 00:25:10,910 Și acum am de gând să imprimare argv 1 0, 1 1 argv - 395 00:25:10,910 --> 00:25:17,040 bine, acum, de când am tăiat salut scurt, argv 1 2 este din nou va fi 396 00:25:17,040 --> 00:25:18,170 backslash 0. 397 00:25:18,170 --> 00:25:25,050 Și astfel, incrementa i și continuă, și așa mai departe, până când vom tipări toate 398 00:25:25,050 --> 00:25:28,580 lume, iar acestea sunt de trei linie de comandă argumente, și vom ieși din 399 00:25:28,580 --> 00:25:31,670 bucla exterioară, și termina programul nostru. 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 >> Așa că haideți să ne întoarcem aici. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Deci, veți obține unele familiaritate cu argumente în linia de comandă de pe acest 406 00:25:52,370 --> 00:25:54,460 problemă deosebită set. 407 00:25:54,460 --> 00:25:56,630 >> Acum, depanare. 408 00:25:56,630 --> 00:26:01,680 Deci, probabil că au avut deja de a face unele depanare cu anterior dvs. 409 00:26:01,680 --> 00:26:03,120 problemă set. 410 00:26:03,120 --> 00:26:08,420 Și o modalitate foarte usoara de depanare, în primul rând, să ne uităm la un program de buggy. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Ei bine, de mers pe jos prin intermediul acestui program, vom cere utilizatorului pentru o 413 00:26:23,830 --> 00:26:29,350 întreg, apuca ca întreg, și apoi, arbitrar, avem o buclă în timp ce 414 00:26:29,350 --> 00:26:32,280 este doar de gând să decrementa i până când este egal cu 10. 415 00:26:32,280 --> 00:26:35,820 Să presupunem Intru un număr întreg mai mare de 10. 416 00:26:35,820 --> 00:26:38,700 Deci, decrement i până când este egal cu 10. 417 00:26:38,700 --> 00:26:42,630 >> Și atunci avem o altă buclă în timp ce că, în timp ce eu nu este egal cu 0, suntem 418 00:26:42,630 --> 00:26:44,540 O să i decrementa de 3. 419 00:26:44,540 --> 00:26:49,790 Deci, dacă vedeți intenția de bug-ul aici, este că aceasta va decrementa i la 420 00:26:49,790 --> 00:26:57,010 fi de 10, iar apoi acest lucru va în timp ce buclă decrement i de la 10, la 7, la 4, la 1, 421 00:26:57,010 --> 00:27:02,880 la 2 negativ, negativ la 5, și așa mai departe, la infinit negativ, deoarece i se va 422 00:27:02,880 --> 00:27:05,920 nu egal cu 0, de fapt. 423 00:27:05,920 --> 00:27:08,610 Apoi, la sfârșitul acestui program, avem funcția de foo care este 424 00:27:08,610 --> 00:27:12,130 întâmplă de imprimare pe care am. 425 00:27:12,130 --> 00:27:16,520 >> Deci, acesta este un program scurt și banal, și bug-ul este evident, 426 00:27:16,520 --> 00:27:18,790 mai ales după ce am doar a spus ceea ce a fost bug-ul. 427 00:27:18,790 --> 00:27:24,840 Dar intenția de aici este, de asemenea, acest lucru ar putea arata de fapt ca o parte din dvs. 428 00:27:24,840 --> 00:27:30,040 soluții de la lacomi de la ultima problema stabilit, și poate că nu aveți 429 00:27:30,040 --> 00:27:32,800 unele buclă infinită în program, și nu aveți nici o idee 430 00:27:32,800 --> 00:27:34,100 care este cauza. 431 00:27:34,100 --> 00:27:38,690 Deci, o tehnică de depanare foarte util este de a adăuga doar printfs 432 00:27:38,690 --> 00:27:40,180 peste tot codul. 433 00:27:40,180 --> 00:27:49,200 >> Deci, aici vreau un printf afara prima buclă în timp. 434 00:27:49,200 --> 00:27:53,155 Și aici vreau un printf, și voi imprima doar eu. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Voi face chiar în primul rând în timp ce bucla, i. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 Exterior, în timp ce al doilea buclă. 439 00:28:09,040 --> 00:28:12,170 Încă o dată, imprimați interior de aici, i valoarea. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 Și să ruleze acest lucru. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> Deci, punct de depanare slash. 444 00:28:24,800 --> 00:28:25,610 Introduceți un număr întreg. 445 00:28:25,610 --> 00:28:28,150 Să facem 13. 446 00:28:28,150 --> 00:28:28,760 Și boom-ul. 447 00:28:28,760 --> 00:28:33,300 Vedem că suntem looping infinit în interiorul celei de a doua buclă în timp. 448 00:28:33,300 --> 00:28:36,305 Deci, acum știm ce bug-ul este. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Dar printf depanare este perfect mare, dar odată ce programele obține 451 00:28:45,610 --> 00:28:50,560 mai lungă și mai complicată, există soluții mai sofisticate pentru 452 00:28:50,560 --> 00:28:51,705 obtinerea lucruri de lucru. 453 00:28:51,705 --> 00:28:52,955 Așa că haideți să elimine toate aceste printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 Și să ne asigurăm că nu am făcut- sparge nimic. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Astfel încât programul vom introducerea se numește 458 00:29:14,180 --> 00:29:16,715 GDB, pentru GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Ei bine, de fapt, să eliminați de depanare pentru un al doilea, și de a face din nou depanare. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Ei bine, de fapt, în primul rând, o lecție bună în argumente în linia de comandă. 463 00:29:34,440 --> 00:29:37,780 Observați că această comandă răsune care este compilarea totul este trecut 464 00:29:37,780 --> 00:29:41,300 la linia de comandă, acestea argumente în linia de comandă. 465 00:29:41,300 --> 00:29:46,250 Deci, exact cum aveți de gând să fie utilizând argumente în linia de comandă, așa cum am 466 00:29:46,250 --> 00:29:51,500 făcut-o înainte, și după cum va fi în PSET 2, așa răsune le utilizează. 467 00:29:51,500 --> 00:30:00,070 >> Astfel observa că acest steag în primul rând, liniuță ggdb3, că ceea ce spune este, răsune, 468 00:30:00,070 --> 00:30:03,790 tu ar trebui să compileze acest fișier cu intenție că vom în cele din urmă 469 00:30:03,790 --> 00:30:05,380 trebuie să-l depanare. 470 00:30:05,380 --> 00:30:13,840 Atâta timp cât aveți acel steag, atunci putem GDB depanare. 471 00:30:13,840 --> 00:30:17,380 Și se va deschide GNU Debugger. 472 00:30:17,380 --> 00:30:22,920 >> Deci, există o mulțime de comenzi de care aveți nevoie să te obișnuiești. 473 00:30:22,920 --> 00:30:27,100 Primul care veți, probabil, imediat nevoie este Run. 474 00:30:27,100 --> 00:30:28,200 Deci, ce se alerga de gând să faci? 475 00:30:28,200 --> 00:30:30,910 Se va porni programul nostru. 476 00:30:30,910 --> 00:30:36,180 Deci rula, programul de pornire, programul ne cere pentru un număr întreg, 13. 477 00:30:36,180 --> 00:30:39,170 Și atunci e looping infinit ca așteptat, cu excepția am scos 478 00:30:39,170 --> 00:30:40,500 printfs, așa că noi nu vedem chiar că. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Ieșit în mod normal. 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 Este posibil ca aceasta înfășurat tot mod special, inapoi la - ignorarea asta. 484 00:30:53,640 --> 00:30:55,170 Să presupunem că nu a ieși în mod normal. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Există un răspuns complicat pentru asta. 487 00:31:03,370 --> 00:31:07,890 >> Deci, acum, că nu e foarte util. 488 00:31:07,890 --> 00:31:11,480 Deci, care rulează doar programul nostru interior de acest depanator nu ne ajuta în orice 489 00:31:11,480 --> 00:31:15,610 Astfel, din moment ce am fi putut face doar punct slash depanare din afara GDB. 490 00:31:15,610 --> 00:31:21,250 Astfel, comanda una care veți probabil - 491 00:31:21,250 --> 00:31:22,970 și voi renunta asta. 492 00:31:22,970 --> 00:31:25,850 -Controlul d sau renunta, ambele de lucru. 493 00:31:25,850 --> 00:31:29,550 Deci, haideți să-l deschidem din nou. 494 00:31:29,550 --> 00:31:31,130 >> O altă comandă pe care le voi probabil doresc imediat să 495 00:31:31,130 --> 00:31:33,600 te obișnuiești este Break. 496 00:31:33,600 --> 00:31:37,120 Deci, vom rupe în principal pentru acum, și apoi să-ți explic asta. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Ei bine, aici vom vedea ne-am stabilit un punct de întrerupere la această linie în debug.c. 499 00:31:46,370 --> 00:31:50,160 Deci, ceea ce înseamnă pauză este că atunci când am tip run, programul se va 500 00:31:50,160 --> 00:31:53,560 continua să ruleze până la Am lovit un punct de întrerupere. 501 00:31:53,560 --> 00:31:59,390 Așa că atunci când am lovit alerga, începe programul, și apoi se rupe de îndată ce se 502 00:31:59,390 --> 00:32:01,940 intră funcția principală. 503 00:32:01,940 --> 00:32:06,930 Break principal va fi ceva tu destul de frecvent face. 504 00:32:06,930 --> 00:32:11,340 >> Și acum, să vă prezint la unele mai multe comenzi. 505 00:32:11,340 --> 00:32:14,330 Observați aici, că se spune noi izbucnit la linia 11, care este 506 00:32:14,330 --> 00:32:16,230 printf, introduceți un număr întreg. 507 00:32:16,230 --> 00:32:21,260 Deci, comanda următoare va fi modul în care vom merge la următoarea linie de cod. 508 00:32:21,260 --> 00:32:24,810 Acest lucru se întâmplă pentru a ne permite să-și intensifice prin linia de programul nostru de linie. 509 00:32:24,810 --> 00:32:26,260 Deci, data viitoare. 510 00:32:26,260 --> 00:32:29,820 >> Acum, linia 12, vom pentru a obține întreg. 511 00:32:29,820 --> 00:32:30,450 Următor. 512 00:32:30,450 --> 00:32:34,290 Și dacă doar te-a lovit Enter din nou, acesta va reface ultimul lucru pe care ai făcut-o. 513 00:32:34,290 --> 00:32:36,480 Așa că nu am nevoie să tastați următor de fiecare dată. 514 00:32:36,480 --> 00:32:40,100 Deci, introduce un număr întreg, 13. 515 00:32:40,100 --> 00:32:46,940 Deci, acum, linia 14, în timp ce i este mai mare decât 10, și voi face în continuare. 516 00:32:46,940 --> 00:32:48,685 Și vom vedea vom i decrementarea. 517 00:32:48,685 --> 00:32:50,210 Așa că am de gând să i decrementa din nou. 518 00:32:50,210 --> 00:32:53,620 >> Deci, acum, un alt util Comanda este Print. 519 00:32:53,620 --> 00:32:55,750 Deci, de imprimare este de gând să imprima valoarea variabilei. 520 00:32:55,750 --> 00:32:57,825 Să aducem la valoarea i de variabile. 521 00:32:57,825 --> 00:32:58,705 Să i imprima. 522 00:32:58,705 --> 00:33:00,910 O să spun că am este 11. 523 00:33:00,910 --> 00:33:03,330 Acum ne-am următoare din nou în timp ce i este mai mare de 10. 524 00:33:03,330 --> 00:33:05,590 Deci, i este încă mai mare decât 10, din moment ce este 11. 525 00:33:05,590 --> 00:33:06,920 i minus minus. 526 00:33:06,920 --> 00:33:08,250 Să i imprima din nou. 527 00:33:08,250 --> 00:33:10,950 Cum era de asteptat, e 10. 528 00:33:10,950 --> 00:33:12,510 >> Deci, acum, următorul. 529 00:33:12,510 --> 00:33:16,250 Se va întoarce la starea, i este mai mare de 10, dar i este acum de 10, așa 530 00:33:16,250 --> 00:33:20,040 nu este mai mare de 10, așa că ne așteptăm l să cadă din bucla în timp ce. 531 00:33:20,040 --> 00:33:22,220 Și acum suntem sub această linie de cod. 532 00:33:22,220 --> 00:33:28,750 Și o altă comandă, lista, este doar de gând pentru a afișa Anterioară și următoare 533 00:33:28,750 --> 00:33:31,240 câteva linii de cod, în cazul în care ți-ai pierdut tu. 534 00:33:31,240 --> 00:33:35,420 Așa că ne-am ieșit din această buclă în timp ce, iar acum ne-am intrat în această 535 00:33:35,420 --> 00:33:37,080 în timp ce bucla, linia 18. 536 00:33:37,080 --> 00:33:39,860 Deci, în timp ce eu nu este egal cu 0. 537 00:33:39,860 --> 00:33:46,570 Și, în continuare, i egal i minus 3, și vom observa, aceasta va continua doar merge. 538 00:33:46,570 --> 00:33:48,270 Și putem imprima. 539 00:33:48,270 --> 00:33:49,990 >> Fiecare comandă are un fel de comenzi rapide. 540 00:33:49,990 --> 00:33:51,720 Deci, p este scurt pentru imprimare. 541 00:33:51,720 --> 00:33:53,400 Deci, putem p i. 542 00:33:53,400 --> 00:33:57,550 Doar ține exploatație n, sau continua să faci următoare. 543 00:33:57,550 --> 00:33:58,340 Imprima i din nou. 544 00:33:58,340 --> 00:34:00,380 Veți vedea acum e negativ 167. 545 00:34:00,380 --> 00:34:06,030 Deci, acest lucru va continua la nesfârșit, dar nu într-adevăr pentru totdeauna, din moment ce tocmai ați văzut, ea 546 00:34:06,030 --> 00:34:09,330 se va termina de fapt, la un moment dat. 547 00:34:09,330 --> 00:34:15,699 >> Astfel că este Începând GDB. 548 00:34:15,699 --> 00:34:19,504 Dar hai sa facem un singur lucru în GDB. 549 00:34:19,504 --> 00:34:20,754 Uh, depanare. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Deci, în acest caz particular, bucla infinita sa întâmplat să fie în interiorul 552 00:34:28,534 --> 00:34:30,050 funcția principală. 553 00:34:30,050 --> 00:34:35,779 Și de acum, să accepte doar că am va muta bucla infinita în 554 00:34:35,779 --> 00:34:37,029 funcția de foo. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Doar amintiți-vă că, la sfârșitul acestei programul, ei bine, aceasta a fost inițial 557 00:34:43,730 --> 00:34:46,210 de asteptare foo, care a fost doar O să i imprima. 558 00:34:46,210 --> 00:34:51,880 Dar acum suntem de asteptare foo, care este O să decrementeze i până când este 0, și 559 00:34:51,880 --> 00:34:54,548 apoi imprimați că variabila. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Salveze. 562 00:34:57,970 --> 00:35:00,175 Face depanare. 563 00:35:00,175 --> 00:35:03,310 Și acum, gdb depanare. 564 00:35:03,310 --> 00:35:04,090 OK. 565 00:35:04,090 --> 00:35:10,580 >> Deci, dacă am alerga, atunci eu nu am de gând să putea să-și intensifice, de fapt prin intermediul meu 566 00:35:10,580 --> 00:35:11,730 programul linie cu linie. 567 00:35:11,730 --> 00:35:19,820 Deci, haideți să rupă de la principal, și apoi tastați alerga. 568 00:35:19,820 --> 00:35:28,160 Deci, du-te prin aceasta, printf, introduceți un întreg, pentru a primi întreg, 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Așa că am de gând să păstreze decrementarea până când am este mai mare de 10. 571 00:35:37,490 --> 00:35:42,840 Apoi, vom cădea prin în timp ce bucla, și ajunge la linia de - 572 00:35:42,840 --> 00:35:44,364 haideți să-l deschide într-o fereastră separată. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Așa că am scădea până când nu mai eram mai mare de 10, iar apoi am 575 00:35:53,300 --> 00:35:55,700 numit funcția, foo. 576 00:35:55,700 --> 00:36:01,340 >> Deci, ceea ce sa întâmplat, de îndată ce l-am lovit funcția de foo, ei bine, am sunat foo, și 577 00:36:01,340 --> 00:36:04,030 atunci nu mai aveam control asupra GDB. 578 00:36:04,030 --> 00:36:10,230 Asa ca imediat ce am lovit următoare la această linie, lucruri a continuat până sa întâmplat acest lucru, 579 00:36:10,230 --> 00:36:12,400 în cazul în care programul Ieșirea - 580 00:36:12,400 --> 00:36:14,450 Presupun că nu exista în cele din urmă. 581 00:36:14,450 --> 00:36:16,390 Ai văzut-o pauză pentru un pic, deși. 582 00:36:16,390 --> 00:36:22,040 Deci, de ce am pierdut controlul asupra programul de la acel moment? 583 00:36:22,040 --> 00:36:27,540 Ei bine, când am tip viitor, care merge la literal următoarea linie de cod care 584 00:36:27,540 --> 00:36:28,850 va executa. 585 00:36:28,850 --> 00:36:35,950 Deci, după linia 21, următoarea linie de cod care va executa este linia 22, 586 00:36:35,950 --> 00:36:38,520 care este, care iese din principal. 587 00:36:38,520 --> 00:36:43,810 Așa că nu vreau să merg doar la următoarea linie de cod. 588 00:36:43,810 --> 00:36:48,170 Vreau să merg în funcție, foo, și apoi pas, de asemenea, prin intermediul 589 00:36:48,170 --> 00:36:49,830 aceste linii de cod. 590 00:36:49,830 --> 00:36:53,726 >> Deci, pentru că, avem o alternativă. 591 00:36:53,726 --> 00:36:56,770 Să renunț din nou. 592 00:36:56,770 --> 00:36:58,020 Break principal. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, urmatoarea, urmatoarea, 13, urmatoarea, next, next, cu grijă, 595 00:37:06,370 --> 00:37:09,820 înainte de a lovi linie foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> Deci, acum, suntem la linia 21, în cazul în care o numim foo. 598 00:37:13,700 --> 00:37:17,100 Noi nu vrem să tastați următorul, din moment ce va apela doar funcția de foo, și 599 00:37:17,100 --> 00:37:18,710 du-te la următoarea linie de cod. 600 00:37:18,710 --> 00:37:20,840 Ceea ce vrem să îl utilizați este pasul. 601 00:37:20,840 --> 00:37:25,690 Deci, există o diferență între Pasul și Next, unde Pasul pași în 602 00:37:25,690 --> 00:37:28,190 funcționeze, și Next merge peste funcția. 603 00:37:28,190 --> 00:37:32,830 Doar execută totalitatea funcția și păstrează merge. 604 00:37:32,830 --> 00:37:37,210 >> Deci, pas este de gând să ne aducă în funcție, foo. 605 00:37:37,210 --> 00:37:41,160 Și vom vedea aici, acum, ne-am întors la această buclă în timp ce este, în teorie, 606 00:37:41,160 --> 00:37:44,190 va continua pentru totdeauna. 607 00:37:44,190 --> 00:37:50,420 Și dacă te-a lovit pas, atunci când nu este chiar o funcție pentru a apela, atunci este 608 00:37:50,420 --> 00:37:51,720 identic cu Next. 609 00:37:51,720 --> 00:37:55,320 Deci, este doar atunci când sunteți la o linie care este de asteptare o funcție care Pasul 610 00:37:55,320 --> 00:37:56,970 este de gând să difere de la Next. 611 00:37:56,970 --> 00:37:57,930 Deci Pasul ne va aduce aici. 612 00:37:57,930 --> 00:38:02,100 Pas, pas, pas, pas, pas, pas, și Vom doar buclă infinită pentru totdeauna. 613 00:38:02,100 --> 00:38:06,810 >> Deci, s-ar putea obisnui cu asta ca dvs. modalitate de a identifica bucle infinite, este 614 00:38:06,810 --> 00:38:08,960 doar deține această tasta Enter pentru a vezi unde te blochezi. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Există modalități mai bune de a face acest lucru, dar de acum, care este perfect suficient. 617 00:38:14,780 --> 00:38:17,967 Și stilistic, să se conformeze Style 50, ar trebui să fi făcut acest lucru. 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 >> Deci, ultima comandă pentru a introduce. 621 00:38:28,400 --> 00:38:30,810 Ei bine, hai sa gdb depanare inch 622 00:38:30,810 --> 00:38:35,580 Deci, în loc de rupere în principal, dacă am cunosc funcția foo este, de asemenea, 623 00:38:35,580 --> 00:38:39,230 problema, atunci am putea avea doar a declarat, la pauza foo, în schimb. 624 00:38:39,230 --> 00:38:42,310 Să spun că am rupe la atât în ​​principal și foo. 625 00:38:42,310 --> 00:38:45,390 Astfel încât să puteți stabili cât mai multe puncte de întrerupere , după cum doriți. 626 00:38:45,390 --> 00:38:49,230 Când am tip alerga, va pentru a opri la - 627 00:38:49,230 --> 00:38:52,180 ooh, să recompilați, deoarece Am schimbat lucrurile. 628 00:38:52,180 --> 00:38:55,950 Veți vedea această linie, de avertizare, sursa fișier este mult mai recent decât executabil. 629 00:38:55,950 --> 00:38:59,680 Asta înseamnă că tocmai m-am dus aici și-a schimbat acestea să fie conforme cu stil 630 00:38:59,680 --> 00:39:03,100 50, dar nu am recompila programului. 631 00:39:03,100 --> 00:39:04,870 Deci, GDB mă face să mă conștient de asta. 632 00:39:04,870 --> 00:39:10,130 Voi renunta, face din nou depanare, lovit gdb depanare. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> Deci, acum, înapoi la ceea ce făceam. 635 00:39:12,800 --> 00:39:15,720 Break principal, pauză foo. 636 00:39:15,720 --> 00:39:20,680 Acum, dacă am rula programul, asa ca este va continua până când lovește un 637 00:39:20,680 --> 00:39:21,320 breakpoint. 638 00:39:21,320 --> 00:39:24,680 Ca punct de întrerupere se întâmplă la fi primul la principal. 639 00:39:24,680 --> 00:39:28,630 Acum, în loc de a face viitor, next, next, next, next, până când am lovit foo, I 640 00:39:28,630 --> 00:39:35,230 posibilitatea să tastați continua, care va continua până când te-a lovit punctul de întrerupere următor. 641 00:39:35,230 --> 00:39:37,200 Trebuie să introduceți întreg primul. 642 00:39:37,200 --> 00:39:40,570 Continua va continua până când am lovit breakpoint următor, care este faptul că 643 00:39:40,570 --> 00:39:43,320 funcția de foo. 644 00:39:43,320 --> 00:39:50,130 >> Astfel Run va rula până când a lovit un punct de întrerupere, dar să tastați doar alerga, atunci când 645 00:39:50,130 --> 00:39:54,060 începi programul, și apoi, de atunci, e continua. 646 00:39:54,060 --> 00:40:01,950 Dacă tocmai am făcut-o rupe principal și apoi a fugit, se va sparge la 647 00:40:01,950 --> 00:40:03,670 principal, și apoi continuați. 648 00:40:03,670 --> 00:40:10,050 Din moment ce nu am un punct de pauză la foo, intra pe întreg, atunci acum sunt 649 00:40:10,050 --> 00:40:11,380 nu va rupe la foo. 650 00:40:11,380 --> 00:40:16,318 Este doar merge la infinit buclă până în acel. 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 >> Așa că e Intro la GDB. 654 00:40:24,420 --> 00:40:27,790 Tu ar trebui să începeți să utilizați-l în seturi de probleme. 655 00:40:27,790 --> 00:40:30,550 Ea poate fi foarte util pentru a identifica bug-uri. 656 00:40:30,550 --> 00:40:35,280 Dacă aveți de fapt doar, linie cu linie, du-te prin codul, și compara ceea ce este 657 00:40:35,280 --> 00:40:39,740 întâmplă de fapt cu ceea ce vă așteptați să se întâmple, atunci e destul de 658 00:40:39,740 --> 00:40:41,060 greu de dor de bug-uri. 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 >> Deci, săptămâna trecută, David a adus acest chestii secrete-cheie de criptare pentru 663 00:40:54,040 --> 00:40:59,350 prima dată, în cazul în care nu vrem parolele doar fi stocate pe noastre 664 00:40:59,350 --> 00:41:03,210 calculator în unele fișier text simplu, în cazul în care cineva poate veni peste și doar 665 00:41:03,210 --> 00:41:04,660 deschideți-l în sus și să le citească. 666 00:41:04,660 --> 00:41:07,530 În mod ideal, ar fi criptate într-un fel. 667 00:41:07,530 --> 00:41:13,340 Și în Problema Set 2, veți fi de-a face cu o metodă de criptare, 668 00:41:13,340 --> 00:41:16,520 sau, de asemenea, două metode, dar ele nu sunt atât de mari. 669 00:41:16,520 --> 00:41:20,050 Daca faci ediția hacker, esti De asemenea, va fi de-a face cu 670 00:41:20,050 --> 00:41:22,150 decriptarea unele lucruri. 671 00:41:22,150 --> 00:41:29,770 >> Deci, problema acum este, ei bine, chiar dacă avem cea mai puternica criptare 672 00:41:29,770 --> 00:41:34,830 algoritm în lume, dacă alegeți un parola deosebit de slab, apoi se 673 00:41:34,830 --> 00:41:37,720 nu te va ajuta foarte mult, deoarece oamenii va fi în continuare în măsură să-l dau seama. 674 00:41:37,720 --> 00:41:41,530 Chiar dacă văzând șirul criptate și se pare ca o mizerie de gunoi 675 00:41:41,530 --> 00:41:44,760 care nu înseamnă nimic pentru ei, în cazul în care încă mai trebuie doar să încercați câteva parole 676 00:41:44,760 --> 00:41:50,560 să-l dau seama, atunci Nu sunt foarte sigur. 677 00:41:50,560 --> 00:41:55,890 Astfel încât vizionarea unui film care face ca punct. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [VIDEO PLAYBACK] 680 00:42:00,970 --> 00:42:02,100 >> -Casca, ai demon. 681 00:42:02,100 --> 00:42:03,370 Ce se întâmplă? 682 00:42:03,370 --> 00:42:05,170 Ce faci cu fiica mea? 683 00:42:05,170 --> 00:42:09,910 >> -Permiteți-mi să introducă genial chirurg plastic tineri, Dr. Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, cel mai mare nas om de locuri de muncă în întreaga 685 00:42:13,730 --> 00:42:16,080 univers, și Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Ta Alteță. 687 00:42:17,210 --> 00:42:18,070 >> -Nas de locuri de muncă? 688 00:42:18,070 --> 00:42:18,670 Nu înțeleg. 689 00:42:18,670 --> 00:42:20,090 A avut deja un loc de muncă nas. 690 00:42:20,090 --> 00:42:21,910 A fost un dulce șaisprezece prezent. 691 00:42:21,910 --> 00:42:22,140 >> -No. 692 00:42:22,140 --> 00:42:23,690 Nu e ceea ce crezi. 693 00:42:23,690 --> 00:42:25,420 Este mult, mult mai rău. 694 00:42:25,420 --> 00:42:30,300 Dacă nu-mi dai o combinație a scutul de aer, Dr. Schlotkin va 695 00:42:30,300 --> 00:42:34,226 da fiica înapoi vechea ei nas. 696 00:42:34,226 --> 00:42:35,476 >> -No. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 De unde ai luat asta? 699 00:42:40,516 --> 00:42:41,440 >> -În regulă. 700 00:42:41,440 --> 00:42:42,180 Îi voi spune. 701 00:42:42,180 --> 00:42:43,381 Îi voi spune. 702 00:42:43,381 --> 00:42:44,263 Nu, tati. 703 00:42:44,263 --> 00:42:45,590 Nu, nu trebuie. 704 00:42:45,590 --> 00:42:46,860 >> -Ai dreptate, draga mea. 705 00:42:46,860 --> 00:42:48,450 Voi dor de noul nas. 706 00:42:48,450 --> 00:42:52,090 Dar eu nu-l va spune combinație, indiferent de ce. 707 00:42:52,090 --> 00:42:53,680 >> -Foarte bine. 708 00:42:53,680 --> 00:42:55,685 Dr. Schlotkin, face cel mai rău dumneavoastră. 709 00:42:55,685 --> 00:42:56,914 >> -Cu placere. 710 00:42:56,914 --> 00:43:00,690 >> [TOOLS ascuțit] 711 00:43:00,690 --> 00:43:01,910 >> -No. 712 00:43:01,910 --> 00:43:02,520 Așteaptă. 713 00:43:02,520 --> 00:43:03,836 Așteaptă. 714 00:43:03,836 --> 00:43:05,300 Îi voi spune. 715 00:43:05,300 --> 00:43:06,880 Îi voi spune. 716 00:43:06,880 --> 00:43:09,130 >> -Știam că va funcționa. 717 00:43:09,130 --> 00:43:09,900 Bine. 718 00:43:09,900 --> 00:43:12,850 Da-mi-o. 719 00:43:12,850 --> 00:43:16,918 >> -Combinația este unul. 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 >> -Trei. 726 00:43:21,310 --> 00:43:21,798 >> -Trei. 727 00:43:21,798 --> 00:43:22,774 >> -Trei. 728 00:43:22,774 --> 00:43:23,262 >> -Patru. 729 00:43:23,262 --> 00:43:23,750 >> -Patru. 730 00:43:23,750 --> 00:43:26,150 >> -Patru. 731 00:43:26,150 --> 00:43:27,010 >> -Cinci. 732 00:43:27,010 --> 00:43:27,670 >> -Cinci. 733 00:43:27,670 --> 00:43:29,010 >> -Cinci. 734 00:43:29,010 --> 00:43:34,770 >> -Deci este: unu, doi, trei, patru, cinci. 735 00:43:34,770 --> 00:43:37,460 Asta e cel mai stupid combinația Am auzit vreodată în viața mea. 736 00:43:37,460 --> 00:43:39,710 Asta e genul de lucru un idiot ar avea asupra bagajele sale. 737 00:43:39,710 --> 00:43:42,000 >> -Mulțumesc, Înălțimea Voastră. 738 00:43:42,000 --> 00:43:43,530 >> -Ce ai făcut? 739 00:43:43,530 --> 00:43:44,490 >> -M-am întors de pe perete. 740 00:43:44,490 --> 00:43:45,420 >> -Nu, nu. 741 00:43:45,420 --> 00:43:45,840 Ai oprit tot filmul. 742 00:43:45,840 --> 00:43:46,930 >> -Cred că am apăsat pe butonul greșit. 743 00:43:46,930 --> 00:43:48,265 >> -Ei bine, pune-l din nou pe. 744 00:43:48,265 --> 00:43:49,110 Pune filmul înapoi. 745 00:43:49,110 --> 00:43:49,510 >> -Da, domnule. 746 00:43:49,510 --> 00:43:49,917 Da, d-le. 747 00:43:49,917 --> 00:43:50,324 >> -Să mergem, Arnold. 748 00:43:50,324 --> 00:43:51,140 Vin, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Desigur, știi că voi încă Trebuie să te factura pentru asta. 750 00:43:53,060 --> 00:43:53,440 >> [END VIDEO PLAYBACK] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: În regulă. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Deci, acum că suntem deja vorbim despre de securitate în unele moduri, frumos 754 00:44:08,430 --> 00:44:16,050 mic film poster, atât în ​​recent zi, aceste probleme cu ANS 755 00:44:16,050 --> 00:44:17,300 monitorizarea totul. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Ea poate fi dificil să se simtă ca tine au un fel de intimitate în 758 00:44:26,930 --> 00:44:34,540 lume on-line, cu toate că nu am putut spune ai cele mai multe dintre detaliile de PRISM. 759 00:44:34,540 --> 00:44:42,130 Deci, se deplasează dincolo de PRISM, nu vom sa vorbim despre asta, acum 760 00:44:42,130 --> 00:44:44,030 cred despre laptop-ul. 761 00:44:44,030 --> 00:44:48,360 Deci, aici, vreau pentru a comuta la contul meu real, 762 00:44:48,360 --> 00:44:50,370 cu micul meu pinguin. 763 00:44:50,370 --> 00:44:57,310 Deci, am un set de parole, și că parola este ceea ce vreau eu să fie. 764 00:44:57,310 --> 00:45:02,430 >> Dar amintiți-vă că ceea ce am de logare cu, astfel încât acest autentificare 765 00:45:02,430 --> 00:45:04,850 promptă, este un alt program. 766 00:45:04,850 --> 00:45:07,910 E un program care a fost scris de către o persoană. 767 00:45:07,910 --> 00:45:13,250 Și astfel, acea persoană, în cazul în care acestea sunt deosebit de malware, acestea ar putea 768 00:45:13,250 --> 00:45:17,780 au spus, în regulă, așa că, dacă parola că am intra este egal cu meu 769 00:45:17,780 --> 00:45:22,800 parola real, sau este egal la unele parolă specială - 770 00:45:22,800 --> 00:45:25,550 David este minunat sau ceva - 771 00:45:25,550 --> 00:45:27,190 apoi lăsați-le inch 772 00:45:27,190 --> 00:45:33,760 Deci, un programator rău intenționat ar putea avea acces la toate Mac-uri, sau 773 00:45:33,760 --> 00:45:36,150 Ferestre, sau orice altceva. 774 00:45:36,150 --> 00:45:41,980 >> Astfel că nu este de mult un motiv de îngrijorare, deoarece, Vreau să spun, acest lucru este un program de autentificare 775 00:45:41,980 --> 00:45:48,720 care este livrat împreună cu OS X, sute sau mii de oameni au 776 00:45:48,720 --> 00:45:50,020 revizuite acest cod. 777 00:45:50,020 --> 00:45:55,330 Și astfel, în cazul în care, în codul de undeva, te spune dacă acest șir este egal la egal la egal 778 00:45:55,330 --> 00:45:58,860 David este minunat, autentificare, atunci cineva va fi, cum ar fi, așteaptă. 779 00:45:58,860 --> 00:45:59,800 Acest lucru nu este corect. 780 00:45:59,800 --> 00:46:01,790 Acest lucru nu ar trebui să fie aici. 781 00:46:01,790 --> 00:46:06,650 Deci, asta e un fel avem lucrurile pentru a fi un fel de sigure. 782 00:46:06,650 --> 00:46:10,300 >> Dar cred că despre programe, chiar pe care le scrie. 783 00:46:10,300 --> 00:46:13,000 Să presupunem că ați scris programul de conectare. 784 00:46:13,000 --> 00:46:20,440 Deci, acest program de autentificare pe care le-ai scris, atât de evident, esti un bun 785 00:46:20,440 --> 00:46:21,210 programator. 786 00:46:21,210 --> 00:46:25,610 Nu sunteți de gând să pună orice malware dacă x este egal cu egal David este minunat 787 00:46:25,610 --> 00:46:27,860 în codul. 788 00:46:27,860 --> 00:46:31,930 Dar acest program, ceea ce nu-i folosi pentru a compila acest program? 789 00:46:31,930 --> 00:46:34,180 Ceva de genul răsune. 790 00:46:34,180 --> 00:46:38,460 Deci, ceea ce în cazul în care persoana care a avut loc la Trimite răsune special casetat în răsune 791 00:46:38,460 --> 00:46:44,310 ceva de genul, dacă eu sunt compilarea Programul de conectare, apoi introduceți codul 792 00:46:44,310 --> 00:46:49,720 în programul de conectare care spune că, în cazul în care x este egal cu egal David este minunat? 793 00:46:49,720 --> 00:46:59,890 Deci, nu destul de încă, dar avem aceeași emite aici, unde răsune, ei bine, 794 00:46:59,890 --> 00:47:03,790 mii, dacă nu zeci de mii de oameni, s-au uitat la răsune, au 795 00:47:03,790 --> 00:47:07,160 sa uitat la liniile sale de cod și a spus, bine, nu e nimic rau aici. 796 00:47:07,160 --> 00:47:10,680 Evident, nimeni nu este de a face nimic acest malware. 797 00:47:10,680 --> 00:47:15,780 >> Dar ceea ce este zăngănit în sine, cum ar fi, ce dacă am compila răsune? 798 00:47:15,780 --> 00:47:20,900 Ce se întâmplă dacă am ceva compilator care compilează răsune care introduce în răsune 799 00:47:20,900 --> 00:47:25,610 acest hack special care spune, bine, atunci când am compila răsune, apoi 800 00:47:25,610 --> 00:47:31,290 executabil I a lua ar trebui să arate special în interiorul a programului de conectare și inserția 801 00:47:31,290 --> 00:47:34,230 această parolă, egal la egal la egal Dave este minunat? 802 00:47:34,230 --> 00:47:37,990 Deci, amintiți-vă că dvs. compilator în sine necesar să se elaboreze la un moment dat. 803 00:47:37,990 --> 00:47:42,810 Deci, dacă ceea ce alegi pentru a compila răsune cu, în sine este rău intenționat, atunci 804 00:47:42,810 --> 00:47:45,580 ar putea fi înșurubată în ansamblu fel pe linie. 805 00:47:45,580 --> 00:47:49,630 >> Deci, aici, avem Ken Thompson și Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 Deci aceasta este o fotografie iconic. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie este pe dreapta. 808 00:47:55,470 --> 00:47:58,740 El este un mare - 809 00:47:58,740 --> 00:48:03,640 destul de mult scris C. Astfel, puteți îi mulțumesc pentru această clasă. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson este pe stânga. 811 00:48:04,840 --> 00:48:07,780 Doi dintre ei, practic, a scris UNIX. 812 00:48:07,780 --> 00:48:10,140 Ei bine, ei au fost o contributie majora în UNIX. 813 00:48:10,140 --> 00:48:11,310 Au fost altele. 814 00:48:11,310 --> 00:48:16,240 Deci Ken Thompson, la un moment dat, el câștigă Premiul Turing. 815 00:48:16,240 --> 00:48:20,860 Și premiul Turing, am auzit mereu se face referire în acest fel, că este vorba de 816 00:48:20,860 --> 00:48:23,100 Premiul Nobel de informatică. 817 00:48:23,100 --> 00:48:27,500 >> Deci, la Premiul Turing, el trebuie să da discursul său de acceptare. 818 00:48:27,500 --> 00:48:31,790 Și el dă acest discurs foarte celebru acum, numit Reflecții asupra Încrederea 819 00:48:31,790 --> 00:48:35,620 Trust, care ne-au legat la pe site-ul curs. 820 00:48:35,620 --> 00:48:41,670 Și în acest discurs, spune el, bine, așa că am scris UNIX, și acum toate 821 00:48:41,670 --> 00:48:43,320 ce oamenii folosesc UNIX. 822 00:48:43,320 --> 00:48:46,960 Acum, amintiți-vă astăzi că Linux este un descendent direct al UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X foloseste direct UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows nu are atât de mult, dar o mulțime de idei au fost luate de la UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Deci, el merge până la scenă și spune, bine, am scris UNIX. 826 00:48:59,220 --> 00:49:03,940 Și așa voi știți, eu sunt capabil să se conecteze la fiecare 827 00:49:03,940 --> 00:49:05,590 unul singur dintre computere. 828 00:49:05,590 --> 00:49:14,280 Din moment ce am pus una dintre acestea special dacă x egal este egal cu Ken Thomson este minunat, 829 00:49:14,280 --> 00:49:16,350 atunci am dreptul să se autentifice. 830 00:49:16,350 --> 00:49:18,370 Deci, oamenii sunt ca, ei bine, Cum ai făcut asta? 831 00:49:18,370 --> 00:49:21,090 Ne-am uitat la programul de conectare și nu e nimic acolo. 832 00:49:21,090 --> 00:49:24,700 E ca, ei bine, am modificat compilatorul pentru a intra în programul de autentificare 833 00:49:24,700 --> 00:49:30,490 astfel încât programul autentificare acum va avea care x este egal este egal cu Ken Thompson 834 00:49:30,490 --> 00:49:31,700 este minunat. 835 00:49:31,700 --> 00:49:33,120 >> Și spun ei, ei bine, asta nu e adevărat. 836 00:49:33,120 --> 00:49:35,740 Ne uitam la compilator, și compilator nu are linii de 837 00:49:35,740 --> 00:49:36,400 cod de genul asta. 838 00:49:36,400 --> 00:49:40,540 E ca și cum, OK, dar ce ești tu compilarea compilatorul cu? 839 00:49:40,540 --> 00:49:44,810 Și ei cred că, și el e, cum ar fi, ei bine, Eu sunt cel care ți-a dat compilatorul 840 00:49:44,810 --> 00:49:50,580 pe care îl utilizați pentru a compila compilator, așa compilați un compilator, care 841 00:49:50,580 --> 00:49:56,390 în sine este rău intenționat, și va întrerupe programul de conectare. 842 00:49:56,390 --> 00:49:59,360 Deci, practic, la acel moment, nu există nici o modalitate de ai putea privi la sursa 843 00:49:59,360 --> 00:50:02,450 cod a programului de conectare pentru a vedea ceea ce este greșit. 844 00:50:02,450 --> 00:50:04,220 Nici nu putea privi în codul sursă al compilatorului 845 00:50:04,220 --> 00:50:06,790 pentru a vedea ceea ce este greșit. 846 00:50:06,790 --> 00:50:11,940 >> Tu ar trebui să se uite la mașină cod, binar efectivă a 847 00:50:11,940 --> 00:50:16,760 compilator compilate pentru a vedea, așteptați, acestea de linii de cod nu ar trebui să fie aici. 848 00:50:16,760 --> 00:50:22,130 Dar Ken Thompson a luat-o cu un pas mai departe și a zis, bine, există 849 00:50:22,130 --> 00:50:25,980 aceste programe speciale, care de fapt vă ajuta să citiți binar de programe, 850 00:50:25,980 --> 00:50:29,340 și deci, dacă cineva a folosit acest program pentru a citi binar, ei ar vedea aceste 851 00:50:29,340 --> 00:50:30,490 de linii de cod. 852 00:50:30,490 --> 00:50:34,020 El a modificat aceste programe de spus, toate Bine, dacă te uiți la 853 00:50:34,020 --> 00:50:38,460 compilator, nu arată acest lucru special set de binare. 854 00:50:38,460 --> 00:50:42,830 >> Deci, atunci trebuie să luați ca un pas în continuare și, practic, care ar putea avea 855 00:50:42,830 --> 00:50:46,210 nivele multiple luate de indirectare, și la un moment dat, nimeni nu e de fapt 856 00:50:46,210 --> 00:50:47,990 O să fie de verificare. 857 00:50:47,990 --> 00:50:52,590 Deci, morala poveștii este, esti nu va fi scris 858 00:50:52,590 --> 00:50:54,340 Zăngănit în această clasă. 859 00:50:54,340 --> 00:50:57,020 Ai de gând să fie folosind alpinism Zăngănit foarte mult în această clasă. 860 00:50:57,020 --> 00:51:00,490 Pentru toate știți, răsune este un rău intenționat program care este sabotat fiecare 861 00:51:00,490 --> 00:51:03,520 singur program care le-ați compilat vreodată. 862 00:51:03,520 --> 00:51:08,206 Și să te las pe care foarte rău augur nota, veți vedea miercuri. 863 00:51:08,206 --> 00:51:10,030 >> [Aplauze] 864 00:51:10,030 --> 00:51:12,935 >> SPEAKER 2: La CS50 următor. 865 00:51:12,935 --> 00:51:14,580 >> SPEAKER 3: Să nu îndrăznești să spui asta. 866 00:51:14,580 --> 00:51:15,930 Puteți face acest lucru. 867 00:51:15,930 --> 00:51:19,440 Ai mai făcut asta înainte, puteți face acest lucru azi, puteți face acest lucru mâine. 868 00:51:19,440 --> 00:51:20,930 Ați făcut acest lucru de ani de zile. 869 00:51:20,930 --> 00:51:22,790 Du-te acolo și de a face acest lucru. 870 00:51:22,790 --> 00:51:24,310 Puteți face acest lucru. 871 00:51:24,310 --> 00:51:26,102 >> [Redare a muzicii]