1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Oke, welkom terug. 3 00:00:12,580 --> 00:00:13,290 Dit is CS50. 4 00:00:13,290 --> 00:00:15,130 Dit is het begin van week zeven. 5 00:00:15,130 --> 00:00:18,890 Dus het is al een tijdje, dus ik dacht dat we neem een ​​wervelwind tour van waar we 6 00:00:18,890 --> 00:00:20,760 ophield en waar we nu gaan. 7 00:00:20,760 --> 00:00:23,310 >> Dus dit ding hier zou kunnen hebben veroorzaakte enige angst op het eerste. 8 00:00:23,310 --> 00:00:27,680 Maar hopelijk, je begint te wennen aan wat dit geeft hier - 9 00:00:27,680 --> 00:00:32,670 ster die een pointer, die net wat, in termen meer leek? 10 00:00:32,670 --> 00:00:33,400 Dus het is een adres. 11 00:00:33,400 --> 00:00:35,490 >> Dus het is het adres van iets in het geheugen. 12 00:00:35,490 --> 00:00:38,260 En we begonnen te pellen van de lagen een paar weken geleden, dingen zoals 13 00:00:38,260 --> 00:00:41,800 GetString en andere dergelijke functies al die tijd hebben terug te keren 14 00:00:41,800 --> 00:00:46,010 adressen van zaken in het geheugen, zoals de adres van het eerste teken in 15 00:00:46,010 --> 00:00:46,990 sommige volgorde. 16 00:00:46,990 --> 00:00:50,360 >> Zodat we ook geïntroduceerd valgrind, die zult u beginnen om te gebruiken voor dit probleem 17 00:00:50,360 --> 00:00:53,380 stellen, met name voor de volgende probleem te stellen ook. 18 00:00:53,380 --> 00:00:54,980 En valgrind doet wat voor ons? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Het controleert voor het geheugen lekken, en het controleert ook voor misbruik van het geheugen. 21 00:01:01,020 --> 00:01:05,890 >> Het kan, met enige waarschijnlijkheid, detecteren of uw code gaat het geheugen raken 22 00:01:05,890 --> 00:01:07,100 dat het gewoon niet moeten doen. 23 00:01:07,100 --> 00:01:10,410 Dus niet per se een lek, maar als je gaan dan de grenzen van een aantal 24 00:01:10,410 --> 00:01:14,730 array, en je daadwerkelijk gereden valgrind en veroorzaken dat gedrag tijdens 25 00:01:14,730 --> 00:01:17,870 valgrind draait in uw programma is loopt binnenkant van het, krijg je 26 00:01:17,870 --> 00:01:21,460 berichten zoals deze - "ongeldige schrijven van maat 4, "die, roepen een paar 27 00:01:21,460 --> 00:01:25,880 weken geleden betekende dat ik had per ongeluk zoals op een int te ver 28 00:01:25,880 --> 00:01:27,250 buiten de grenzen van een array. 29 00:01:27,250 --> 00:01:30,790 En dus maat 4 betekent hier de grootte van dat int. 30 00:01:30,790 --> 00:01:35,260 >> Dus neem de herverzekering voor het feit dat valgrind de output, het formaat ervan, 31 00:01:35,260 --> 00:01:36,170 is gewoon afschuwelijk. 32 00:01:36,170 --> 00:01:40,180 Het is echt moeilijk te zien door de rommel voor de interessante informatie. 33 00:01:40,180 --> 00:01:42,910 Dus wat we hier hebben gedaan is gewoon fragment enkele paar meer 34 00:01:42,910 --> 00:01:43,850 interessante lijnen. 35 00:01:43,850 --> 00:01:46,760 Maar beseffen dat 80% van de valgrind's uitgang gaat een beetje een te zijn 36 00:01:46,760 --> 00:01:47,650 afleiding. 37 00:01:47,650 --> 00:01:52,820 >> Gewoon zoeken naar patronen als deze - ongeldige recht, ongeldig te lezen, 40 bytes 38 00:01:52,820 --> 00:01:56,690 en sommige aantal blokken zijn zeker verloren, trefwoorden als dat. 39 00:01:56,690 --> 00:02:01,920 En wat u zult hopelijk zien is wat soort spoor van welke functie de 40 00:02:01,920 --> 00:02:03,340 fout is eigenlijk inch 41 00:02:03,340 --> 00:02:07,195 In dit geval hier, in welke regel van mijn code was de fout blijkbaar? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 in een bestand genaamd memory.c, dat was het voorbeeld dat we aan het spelen waren met 44 00:02:14,130 --> 00:02:14,890 op dat moment. 45 00:02:14,890 --> 00:02:16,460 Dus het is waarschijnlijk niet in malloc. 46 00:02:16,460 --> 00:02:18,630 Het was waarschijnlijk in mijn code plaats. 47 00:02:18,630 --> 00:02:20,910 Dus zullen we dit opnieuw zien en opnieuw vóór lang. 48 00:02:20,910 --> 00:02:24,080 >> Dus scanf, dit kwam in een paar vormen tot nu toe. 49 00:02:24,080 --> 00:02:26,410 We zagen sscanf kort. 50 00:02:26,410 --> 00:02:28,330 Het was iets wat een aantal je dook in uw 51 00:02:28,330 --> 00:02:29,535 voorbereidingen voor de quiz. 52 00:02:29,535 --> 00:02:33,130 En scanf is eigenlijk wat de CS50 bibliotheek is al met behulp van onder de 53 00:02:33,130 --> 00:02:36,560 hood al geruime tijd in orde om invoer van de gebruiker. 54 00:02:36,560 --> 00:02:40,420 >> Bijvoorbeeld, als ik dan naar de CS50 apparaat hier, laat me open te stellen een 55 00:02:40,420 --> 00:02:45,315 bijvoorbeeld vandaag dat scanf-0.c heet En het is super simpel. 56 00:02:45,315 --> 00:02:46,590 Het is slechts een paar regels code. 57 00:02:46,590 --> 00:02:50,880 Maar het toont echt hoe getInt heeft gewerkt al die tijd. 58 00:02:50,880 --> 00:02:54,710 >> Hier in dit programma, in lijn 16 , Mede dat ik verklaar een int. 59 00:02:54,710 --> 00:02:57,270 Dus geen pointers, niets magisch daar, gewoon een int. 60 00:02:57,270 --> 00:03:00,330 Vervolgens in lijn 17, ik prompt de gebruiker voor een nummer, alstublieft. 61 00:03:00,330 --> 00:03:02,930 Toen in de late 18, gebruik ik scanf hier. 62 00:03:02,930 --> 00:03:06,910 En ik heb opgegeven, net zoiets als printf, dat verwacht ik citeer 63 00:03:06,910 --> 00:03:08,110 unquote procent i. 64 00:03:08,110 --> 00:03:10,920 >> Dus percent i natuurlijk geeft een int. 65 00:03:10,920 --> 00:03:14,580 Maar let op wat de tweede argument om scanf is. 66 00:03:14,580 --> 00:03:17,350 Hoe zou je de tweede beschrijven argument na de komma? 67 00:03:17,350 --> 00:03:19,450 Wat is dat? 68 00:03:19,450 --> 00:03:20,670 >> Het is het adres van x. 69 00:03:20,670 --> 00:03:25,490 Dit is zo nuttig omdat door het verstrekken scanf met het adres van x, wat doet 70 00:03:25,490 --> 00:03:29,560 dat die functie in staat stellen om te doen? 71 00:03:29,560 --> 00:03:33,010 Niet alleen gaan er, maar ook wat doen? 72 00:03:33,010 --> 00:03:34,060 >> Maak een wijziging van het. 73 00:03:34,060 --> 00:03:38,080 Want je kunt er naartoe, het is een soort van als een kaart om een ​​locatie in het geheugen. 74 00:03:38,080 --> 00:03:41,900 En zolang u scanf, of een functie met een dergelijke kaart, die 75 00:03:41,900 --> 00:03:45,840 functie kunnen er terecht, en niet alleen kijken naar de waarde, maar het kan ook 76 00:03:45,840 --> 00:03:49,670 verandering die waarde, die handig als is het doel in het leven van scanf is om 77 00:03:49,670 --> 00:03:53,060 scan input van de gebruiker, in het bijzonder het toetsenbord. 78 00:03:53,060 --> 00:03:57,830 En de f geeft opgemaakte, net als printf, de f staat voor een geformatteerde 79 00:03:57,830 --> 00:03:58,930 snaar die u wilt afdrukken. 80 00:03:58,930 --> 00:04:04,430 >> Dus in het kort, deze lijn 18 zegt eenvoudig, proberen om een ​​int van de gebruiker lezen 81 00:04:04,430 --> 00:04:10,420 toetsenbord en slaan binnenkant van x op welk adres x toevallig wonen. 82 00:04:10,420 --> 00:04:14,860 En dan tot slot, lijn 19 net zegt, bedankt voor de int, in dit geval. 83 00:04:14,860 --> 00:04:15,940 >> Dus laat me ga je gang en maken dit. 84 00:04:15,940 --> 00:04:18,570 Dus zorg scanf 0. 85 00:04:18,570 --> 00:04:20,130 Laat me ga je gang en vergroten 86 00:04:20,130 --> 00:04:22,960 Ik ga lopen dit met stippen slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Nummer, alstublieft? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Bedankt voor de 50. 90 00:04:25,730 --> 00:04:27,270 Dus het is heel simpel. 91 00:04:27,270 --> 00:04:28,160 >> Nu, wat is het niet te doen? 92 00:04:28,160 --> 00:04:29,940 Het is niet te doen een hele hoop van foutcontrole. 93 00:04:29,940 --> 00:04:33,000 Bijvoorbeeld, als ik niet meewerken, en ik denk niet typen in een getal, maar 94 00:04:33,000 --> 00:04:37,860 plaats ik iets als "hello", schrijven dat is gewoon een beetje vreemd. 95 00:04:37,860 --> 00:04:41,130 En dus een van de dingen die de CS50 bibliotheek heeft gedaan voor ons voor enige 96 00:04:41,130 --> 00:04:43,440 tijd is dat reprompting en reprompting. 97 00:04:43,440 --> 00:04:49,320 >> De retry zinsnede recall was in cs50.c, en dat is de reden dat getInt in 98 00:04:49,320 --> 00:04:51,670 de CS50 bibliotheek is eigenlijk een hele stelletje regels lang, omdat we 99 00:04:51,670 --> 00:04:53,190 het controleren op stomme dingen zoals dit. 100 00:04:53,190 --> 00:04:55,730 Heeft de gebruiker niet geven ons, in feite, een int? 101 00:04:55,730 --> 00:04:57,910 Heeft hij of zij iets geven ons als een alfabetische letter? 102 00:04:57,910 --> 00:05:01,410 Als dat zo is, willen we op te sporen die en schreeuwen tegen hen. 103 00:05:01,410 --> 00:05:03,915 >> Maar dingen interessanter in het volgende voorbeeld. 104 00:05:03,915 --> 00:05:09,840 Als ik naar scanf-1.c, wat is het een wat fundamenteel veranderd 105 00:05:09,840 --> 00:05:11,135 het volgende voorbeeld? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Ik gebruik char *, natuurlijk, in plaats van int. 108 00:05:16,010 --> 00:05:19,210 >> Dit is zo interessant, omdat char *, herinneren, is eigenlijk alleen maar de 109 00:05:19,210 --> 00:05:20,190 Hetzelfde als string. 110 00:05:20,190 --> 00:05:23,840 Dus het voelt alsof misschien is dit een super eenvoudige implementatie van GetString. 111 00:05:23,840 --> 00:05:26,010 Maar ik heb de laag geschild terug van de CS50 bibliotheek, dus ik ben 112 00:05:26,010 --> 00:05:27,550 roepen deze char * nu. 113 00:05:27,550 --> 00:05:30,070 Dus laten we zien waar, indien ergens, we gaan mis. 114 00:05:30,070 --> 00:05:30,840 >> Line 17 - 115 00:05:30,840 --> 00:05:33,950 Ik zeg nogmaals, geef me iets, in dit geval, een string. 116 00:05:33,950 --> 00:05:37,940 En dan in de volgende regel, roep ik scanf, weer, waardoor het een formaat code, 117 00:05:37,940 --> 00:05:39,310 maar deze keer procent s. 118 00:05:39,310 --> 00:05:41,900 En dan deze keer, ben ik waardoor het buffer. 119 00:05:41,900 --> 00:05:43,550 >> Let nu op, ik ben niet met behulp van de ampersand. 120 00:05:43,550 --> 00:05:47,120 Maar waarom is hier dat waarschijnlijk OK? 121 00:05:47,120 --> 00:05:49,760 Want wat is buffer al? 122 00:05:49,760 --> 00:05:50,770 Het is al een pointer. 123 00:05:50,770 --> 00:05:51,650 Het is al een adres. 124 00:05:51,650 --> 00:05:54,510 >> En laten we dit woord "verwarren," laat me noem het s, bijvoorbeeld voor 125 00:05:54,510 --> 00:05:55,050 eenvoud. 126 00:05:55,050 --> 00:05:58,250 Maar ik heb wel het bufferen omdat in algemeen, in de programmering, als u een 127 00:05:58,250 --> 00:06:02,130 stuk van het geheugen, die een string echt gewoon is, zou je het noemen een buffer. 128 00:06:02,130 --> 00:06:04,460 Het is een plek om informatie op te slaan. 129 00:06:04,460 --> 00:06:07,400 >> Vergelijkbaar met zaken als YouTube, wanneer ze bufferen, zo te zeggen, dat 130 00:06:07,400 --> 00:06:10,270 betekent gewoon dat het is gedownload bits van het internet en ze op te slaan in een 131 00:06:10,270 --> 00:06:14,160 lokale array, een lokale brok van geheugen, zodat dat je het later kunt kijken zonder 132 00:06:14,160 --> 00:06:16,830 het overslaan of opknoping op u tijdens het afspelen. 133 00:06:16,830 --> 00:06:20,930 >> Dus er is een probleem hier wel, want ik zeg scanf, verwachten een 134 00:06:20,930 --> 00:06:22,320 koord van de gebruiker. 135 00:06:22,320 --> 00:06:24,410 Hier is het adres van de een stuk van het geheugen. 136 00:06:24,410 --> 00:06:26,180 Zet er die string. 137 00:06:26,180 --> 00:06:31,230 Waarom is dat gebonden te geven ons probleem, hoewel? 138 00:06:31,230 --> 00:06:33,490 >> Wat is dat? 139 00:06:33,490 --> 00:06:35,510 Mag ik toegang dat deel van het geheugen? 140 00:06:35,510 --> 00:06:36,250 Weet je, ik weet het niet. 141 00:06:36,250 --> 00:06:39,210 Omdat er buffer geïnitialiseerd naar iets? 142 00:06:39,210 --> 00:06:39,820 Niet echt. 143 00:06:39,820 --> 00:06:43,090 En dus is het wat we hebben te bellen een vuilnisbak waarde, die 144 00:06:43,090 --> 00:06:44,040 is geen formeel woord. 145 00:06:44,040 --> 00:06:49,200 Het betekent alleen dat we geen idee hebben wat stukjes zijn in de vier bytes die 146 00:06:49,200 --> 00:06:51,240 Ik heb toegewezen als buffer. 147 00:06:51,240 --> 00:06:52,450 >> Ik heb niet geroepen malloc. 148 00:06:52,450 --> 00:06:53,940 Ik heb absoluut niet geroepen GetString. 149 00:06:53,940 --> 00:06:56,380 Dus wie weet wat is eigenlijk binnenkant van buffer? 150 00:06:56,380 --> 00:07:00,550 En toch vertellen scanf blind, gaan er en zetten wat de gebruiker heeft ingevoerd. 151 00:07:00,550 --> 00:07:04,460 >> Dus wat zou kunnen leiden tot in onze code als we lopen het? 152 00:07:04,460 --> 00:07:05,700 Waarschijnlijk een segfault. 153 00:07:05,700 --> 00:07:07,970 Misschien niet, maar waarschijnlijk een segfault. 154 00:07:07,970 --> 00:07:10,620 En ik zeg misschien niet want soms je doet, soms 155 00:07:10,620 --> 00:07:11,380 je krijgt niet een segfault. 156 00:07:11,380 --> 00:07:14,280 Soms heb je gewoon geluk, maar het is niettemin gaat worden 157 00:07:14,280 --> 00:07:15,340 een bug in ons programma. 158 00:07:15,340 --> 00:07:17,060 >> Dus laat me ga je gang, en slaat deze. 159 00:07:17,060 --> 00:07:18,280 Ik ga het de oude school manier te doen. 160 00:07:18,280 --> 00:07:23,825 Dus clang dash 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Oeps, te oud school. 162 00:07:24,720 --> 00:07:26,550 Laten we eens kijken. 163 00:07:26,550 --> 00:07:28,440 Waar ging ik heen? 164 00:07:28,440 --> 00:07:29,700 Oh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, dank je wel - 167 00:07:35,130 --> 00:07:36,930 Opslaan, OK - 168 00:07:36,930 --> 00:07:37,690 zeer oude school. 169 00:07:37,690 --> 00:07:38,900 Oke, het is al een tijdje. 170 00:07:38,900 --> 00:07:41,720 >> Dus ik heb net het bestand na opgeslagen maken van die tijdelijke 171 00:07:41,720 --> 00:07:42,700 veranderen een moment geleden. 172 00:07:42,700 --> 00:07:46,090 En nu heb ik het gecompileerd handmatig met Clang. 173 00:07:46,090 --> 00:07:49,500 En nu ga ik om verder te gaan en run scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String alsjeblieft. 175 00:07:50,290 --> 00:07:51,600 Ik type in "hello." 176 00:07:51,600 --> 00:07:54,070 >> En nu, hier is waar, eerlijk gezegd, printf kan is een beetje vervelend. 177 00:07:54,070 --> 00:07:56,020 Het is niet daadwerkelijk gaat segfault in dit geval. 178 00:07:56,020 --> 00:07:59,860 Printf is een beetje speciaal, omdat het is zo super vaak gebruikt dat 179 00:07:59,860 --> 00:08:03,570 wezen printf doet ons een plezier en realiseren, 180 00:08:03,570 --> 00:08:04,830 dat is geen geldige pointer. 181 00:08:04,830 --> 00:08:09,080 Laat ik neem het op me om gewoon af te drukken buiten haakjes null, zelfs 182 00:08:09,080 --> 00:08:13,340 maar het is niet per se wat we ons verwacht. 183 00:08:13,340 --> 00:08:16,940 >> Dus we kunnen niet echt gemakkelijk leiden tot een segfault met deze, maar het is duidelijk dit 184 00:08:16,940 --> 00:08:18,600 is niet het gedrag dat ik wilde. 185 00:08:18,600 --> 00:08:19,800 Dus wat is de eenvoudige oplossing? 186 00:08:19,800 --> 00:08:25,650 Nou, in scanf-2, laat me voorstellen dat in plaats van eigenlijk alleen toewijzing van een 187 00:08:25,650 --> 00:08:30,100 char *, laat me een beetje slimmer over Dit, en laat me buffer toewijzen 188 00:08:30,100 --> 00:08:32,940 als een opeenvolging van 16 tekens. 189 00:08:32,940 --> 00:08:34,200 >> Dus kan ik dit doen in een paar manieren. 190 00:08:34,200 --> 00:08:35,610 Ik zou absoluut gebruik malloc. 191 00:08:35,610 --> 00:08:38,980 Maar ik kan terug naar week twee bij Ik heb gewoon een hele hoop nodig 192 00:08:38,980 --> 00:08:39,620 tekens. 193 00:08:39,620 --> 00:08:40,860 Dat is gewoon een array. 194 00:08:40,860 --> 00:08:44,870 Dus laat mij in plaats herdefiniëren buffer om een ​​array van 16 tekens zijn. 195 00:08:44,870 --> 00:08:47,340 >> En nu, toen ik pas buffer in - 196 00:08:47,340 --> 00:08:49,940 en dit is iets wat we niet praten over in week twee - 197 00:08:49,940 --> 00:08:53,730 maar je kunt een array als behandelen al is het een adres. 198 00:08:53,730 --> 00:08:56,390 Technisch gezien, zoals we hebben gezien, zijn ze een beetje anders. 199 00:08:56,390 --> 00:09:01,290 Maar scanf zal het niet erg als je het door te geven de naam van een array, want wat 200 00:09:01,290 --> 00:09:05,030 Clang te doen voor ons is in wezen de behandeling van de naam van die array als de 201 00:09:05,030 --> 00:09:08,280 adres van de brok van 16 bytes. 202 00:09:08,280 --> 00:09:09,550 >> Dus dit is beter. 203 00:09:09,550 --> 00:09:12,110 Dit betekent nu dat ik kan hopelijk doet u het volgende. 204 00:09:12,110 --> 00:09:16,800 Laat me uit te zoomen voor een moment en doe make scanf-2, OK samengesteld. 205 00:09:16,800 --> 00:09:19,390 Nu laat ik heb gekregen slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 String alsjeblieft. "Hallo." En leek deze keer het werk. 207 00:09:22,430 --> 00:09:26,020 >> Maar kan iemand een scenario voor te stellen waar het misschien niet nog steeds werken? 208 00:09:26,020 --> 00:09:28,550 Yeah? 209 00:09:28,550 --> 00:09:30,640 Iets langer dan 16 tekens. 210 00:09:30,640 --> 00:09:32,020 En eigenlijk kunnen we er een beetje nauwkeuriger. 211 00:09:32,020 --> 00:09:36,540 Iets langer dan 15 tekens, want echt moeten we in gedachten houden 212 00:09:36,540 --> 00:09:39,920 dat we moeten dat backslash nul impliciet aan het eind van de tekenreeks 213 00:09:39,920 --> 00:09:42,950 dat is een terzijde scanf zal doorgaans verzorgen voor ons. 214 00:09:42,950 --> 00:09:46,210 >> Dus laat ik zoiets doe - 215 00:09:46,210 --> 00:09:48,040 Soms kunnen we gewoon laat het zo. 216 00:09:48,040 --> 00:09:50,630 OK, dus we hebben nu geïnduceerde onze segmentation fault. 217 00:09:50,630 --> 00:09:51,000 Waarom? 218 00:09:51,000 --> 00:09:54,940 Want ik typte om meer dan 15 personages, en dus we hebben eigenlijk 219 00:09:54,940 --> 00:09:58,280 aangeraakt geheugen dat ik eigenlijk mag niet. 220 00:09:58,280 --> 00:10:00,180 >> Dus wat is eigenlijk de oplossing hier? 221 00:10:00,180 --> 00:10:02,210 Nou, wat als we een langere snaar nodig? 222 00:10:02,210 --> 00:10:03,960 Nou ja, misschien maken we het 32 ​​bytes. 223 00:10:03,960 --> 00:10:05,160 Nou, wat als dat niet lang genoeg? 224 00:10:05,160 --> 00:10:06,040 Hoe zit het met 64 bytes? 225 00:10:06,040 --> 00:10:07,080 Wat als dat niet lang genoeg? 226 00:10:07,080 --> 00:10:09,640 Hoe zit het met 128 of 200 bytes? 227 00:10:09,640 --> 00:10:12,660 Wat is eigenlijk de oplossing hier in het algemene geval, als we niet weten in 228 00:10:12,660 --> 00:10:14,460 vooruit wat de gebruiker gaat typen? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Het is gewoon een soort van een grote pijn in de kont, om eerlijk te zijn, dat is de reden waarom de 231 00:10:23,050 --> 00:10:29,050 CS50 bibliotheek heeft enkele tientallen regels code die gezamenlijk implementeren 232 00:10:29,050 --> 00:10:32,390 GetString snaar op een manier die wij niet moeten weten van tevoren wat de 233 00:10:32,390 --> 00:10:33,430 gebruiker gaat typen. 234 00:10:33,430 --> 00:10:37,370 In het bijzonder, als je terugkijkt op cs50.c van twee weken geleden, zie je 235 00:10:37,370 --> 00:10:40,480 dat GetString eigenlijk doet Gebruik scanf op deze manier. 236 00:10:40,480 --> 00:10:43,720 Integendeel, leest een teken tegelijk. 237 00:10:43,720 --> 00:10:46,010 >> Omdat het een leuke het lezen van een teken is dat we kunnen 238 00:10:46,010 --> 00:10:48,490 garanderen onszelf altijd ten minste een char. 239 00:10:48,490 --> 00:10:51,740 Ik kan gewoon een char te verklaren, en neem dan deze echt kleine stapjes om gewoon 240 00:10:51,740 --> 00:10:54,380 lees een teken in op een tijd vanaf het toetsenbord. 241 00:10:54,380 --> 00:10:58,240 En dan, wat je ziet GetString doet is elke keer het loopt uit, 242 00:10:58,240 --> 00:11:02,280 zeggen 16 bytes geheugen, gebruikt malloc, of een neef daarvan, te 243 00:11:02,280 --> 00:11:06,810 toewijzen meer geheugen, het kopiëren van de oude geheugen in de nieuwe, en dan kruipen 244 00:11:06,810 --> 00:11:09,900 langs, het krijgen van een teken tegelijk, en wanneer het loopt uit dat 245 00:11:09,900 --> 00:11:13,370 stuk van het geheugen, gooit het weg, grijpers een groter stuk van het geheugen, kopieert oud 246 00:11:13,370 --> 00:11:14,750 in nieuwe en herhalingen. 247 00:11:14,750 --> 00:11:18,480 En het is echt een pijn om daadwerkelijk iets eenvoudigs als het implementeren 248 00:11:18,480 --> 00:11:19,710 krijgt input van een gebruiker. 249 00:11:19,710 --> 00:11:21,090 >> Dus je kunt scanf gebruiken. 250 00:11:21,090 --> 00:11:22,430 U kunt gebruik maken van andere vergelijkbare functies. 251 00:11:22,430 --> 00:11:25,420 En veel van studieboeken en online voorbeelden te doen, maar ze zijn allemaal 252 00:11:25,420 --> 00:11:27,210 kwetsbaar voor dit soort problemen. 253 00:11:27,210 --> 00:11:29,550 En uiteindelijk, het krijgen van een segfault is soort vervelend. 254 00:11:29,550 --> 00:11:30,680 Het is niet goed voor de gebruiker. 255 00:11:30,680 --> 00:11:33,560 >> Maar in het ergste geval, wat doet het fundamenteel uw zetten 256 00:11:33,560 --> 00:11:37,160 code risico op? 257 00:11:37,160 --> 00:11:39,250 Een soort aanval, mogelijk. 258 00:11:39,250 --> 00:11:41,680 We spraken over een dergelijke aanval - overlopen de stack. 259 00:11:41,680 --> 00:11:44,660 Maar in het algemeen, als je mag overflow een buffer, zoals wij deden een 260 00:11:44,660 --> 00:11:48,070 paar weken geleden, met alleen het schrijven meer dan "hallo" op de stapel, je 261 00:11:48,070 --> 00:11:52,330 kan inderdaad overnemen, potentieel, een computer, of op zijn minst te krijgen op gegevens die 262 00:11:52,330 --> 00:11:53,510 hoort niet bij jou. 263 00:11:53,510 --> 00:11:55,970 >> Dus in het kort, dit is waarom we hebben die zijwieltjes. 264 00:11:55,970 --> 00:11:59,090 Maar nu, beginnen we ze af, als onze programma's niet meer nodig, 265 00:11:59,090 --> 00:12:00,610 se, input van de gebruiker. 266 00:12:00,610 --> 00:12:03,960 Maar in het geval van problemen stellen zes, Uw inbreng zal komen uit een enorme 267 00:12:03,960 --> 00:12:07,520 woordenboek bestand met 150 enkele oneven duizend woorden. 268 00:12:07,520 --> 00:12:10,330 >> Zodat u geen zorgen te maken over willekeurige invoer van de gebruiker. 269 00:12:10,330 --> 00:12:13,720 Wij geven u een aantal veronderstellingen te geven over dat bestand. 270 00:12:13,720 --> 00:12:20,340 Voor vragen over pointers of scanf of invoer van de gebruiker in het algemeen? 271 00:12:20,340 --> 00:12:24,450 >> Oke, dus een snelle blik toen op een trailing onderwerp van twee weken geleden. 272 00:12:24,450 --> 00:12:28,590 En dat was het idee van een structuur. 273 00:12:28,590 --> 00:12:34,180 Niet dat - dit begrip een struct, die was wat? 274 00:12:34,180 --> 00:12:35,430 Wat deed struct voor ons doen? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definieer - 277 00:12:39,860 --> 00:12:41,710 spijt? 278 00:12:41,710 --> 00:12:42,820 Definieer een variabele soort. 279 00:12:42,820 --> 00:12:44,410 Dus soort van. 280 00:12:44,410 --> 00:12:46,180 We zijn eigenlijk een combinatie van twee onderwerpen. 281 00:12:46,180 --> 00:12:49,510 Dus met typedef, herinneren dat we kunnen verklaren een soort van onze eigen, als een 282 00:12:49,510 --> 00:12:51,500 synoniem, net string voor char *. 283 00:12:51,500 --> 00:12:56,200 Maar met behulp van typedef en struct, we kunnen maak echt onze eigen datastructuren. 284 00:12:56,200 --> 00:12:59,600 >> Bijvoorbeeld, als ik terug in gedit hier voor slechts een moment, en ik ga je gang 285 00:12:59,600 --> 00:13:08,230 en doe iets als, laat me sparen dit als, laten we zeggen, structs.c 286 00:13:08,230 --> 00:13:10,840 tijdelijk, ik ga gewoon om verder te gaan en omvatten 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main leegte. 288 00:13:14,360 --> 00:13:18,960 En dan hier, stel dat ik wil om een ​​programma dat opslaat schrijven 289 00:13:18,960 --> 00:13:21,840 meerdere studenten van meerdere huizen, bijvoorbeeld. 290 00:13:21,840 --> 00:13:24,430 Dus het is als een registrarial database van een soort. 291 00:13:24,430 --> 00:13:29,550 >> Dus als ik de naam een ​​student, ik misschien iets doen als char * naam, 292 00:13:29,550 --> 00:13:31,570 en ik zal iets doen als - 293 00:13:31,570 --> 00:13:34,410 eigenlijk, laten we gebruik maken van de CS50 bibliotheek voor slechts een moment om dit een te maken 294 00:13:34,410 --> 00:13:38,380 iets eenvoudiger, zodat we kunnen lenen die tientallen regels code. 295 00:13:38,380 --> 00:13:39,340 En laten we het simpel houden. 296 00:13:39,340 --> 00:13:42,610 We houden het koord, en nu getString. 297 00:13:42,610 --> 00:13:47,420 >> Dus ik beweren nu dat ik de naam heb opgeslagen van een aantal studenten, en het huis van 298 00:13:47,420 --> 00:13:50,240 enkele student, gewoon met behulp van variabelen zoals wij deden en in week een. 299 00:13:50,240 --> 00:13:52,370 Maar stel dat ik nu wil steunen meerdere studenten. 300 00:13:52,370 --> 00:13:58,460 Oke, dus mijn instincten te doen snaar name2, krijgt GetString, touwtje 301 00:13:58,460 --> 00:14:01,370 house2 krijgt GetString. 302 00:14:01,370 --> 00:14:05,850 En dan is onze derde student, laten we name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Oke, dus dit is hopelijk opvallende u als een soort van domme, 304 00:14:09,170 --> 00:14:11,580 omdat dit proces is eigenlijk nooit gaat eindigen, en het zal alleen maar 305 00:14:11,580 --> 00:14:13,130 maak mijn code er slechter uitzien en erger en erger. 306 00:14:13,130 --> 00:14:14,810 Maar we loste ook dit in week twee. 307 00:14:14,810 --> 00:14:19,450 Wat was onze relatief schone oplossing toen hadden we meerdere variabelen van de 308 00:14:19,450 --> 00:14:23,580 hetzelfde gegevenstype die allemaal gerelateerd zijn, maar we niet willen dat deze gruwelijke puinhoop 309 00:14:23,580 --> 00:14:26,870 van de gelijknamige variabelen? 310 00:14:26,870 --> 00:14:30,060 Wat hebben we in plaats daarvan doen? 311 00:14:30,060 --> 00:14:31,260 >> Dus ik denk dat ik hoorde een paar plaatsen. 312 00:14:31,260 --> 00:14:32,590 We hadden een array. 313 00:14:32,590 --> 00:14:37,110 Als u wilt meerdere exemplaren van iets, waarom doen we dit allemaal schoon 314 00:14:37,110 --> 00:14:39,540 up en gewoon zeggen, geef mij array met de naam namen? 315 00:14:39,540 --> 00:14:41,640 >> En voor nu, laten we harde code 3. 316 00:14:41,640 --> 00:14:44,450 En geef me dan een andere array riep huizen, en laat mij voor 317 00:14:44,450 --> 00:14:45,800 nu harde code 3. 318 00:14:45,800 --> 00:14:49,220 En ik heb massaal opgeruimd de rotzooi die ik net gemaakt. 319 00:14:49,220 --> 00:14:52,400 Nu, ik heb nog steeds hard gecodeerd 3, maar zelfs de 3 kan dynamisch uit de 320 00:14:52,400 --> 00:14:54,350 gebruiker, of argv, of dergelijke. 321 00:14:54,350 --> 00:14:55,720 Dus dit is nu al schoner. 322 00:14:55,720 --> 00:15:00,100 >> Maar wat is vervelend over dit is dat Nu, zelfs al een naam is een of andere manier 323 00:15:00,100 --> 00:15:02,280 fundamenteel verbonden een student house - 324 00:15:02,280 --> 00:15:04,720 het is een student die ik echt willen vertegenwoordigen - 325 00:15:04,720 --> 00:15:08,080 Ik heb nu twee arrays die parallel zijn in de zin dat ze de 326 00:15:08,080 --> 00:15:13,930 dezelfde grootte, en namen beugel 0 vermoedelijk kaarten om huizen beugel 0, 327 00:15:13,930 --> 00:15:16,600 en namen beugel 1 kaarten om huizen beugel 1. 328 00:15:16,600 --> 00:15:19,280 Met andere woorden, student woont dat huis, en dat de andere student 329 00:15:19,280 --> 00:15:20,530 woont in dat andere huis. 330 00:15:20,530 --> 00:15:23,720 Maar zeker dit kan worden gedaan, zelfs schoner. 331 00:15:23,720 --> 00:15:24,990 >> Nou, het kan, in feite. 332 00:15:24,990 --> 00:15:28,730 En laat mij ga je gang en open up structs.h, en je zult 333 00:15:28,730 --> 00:15:31,130 zie hier dit idee. 334 00:15:31,130 --> 00:15:34,905 Merk op dat ik typedef heb gebruikt, zoals u gezinspeeld op een moment geleden te verklaren onze 335 00:15:34,905 --> 00:15:35,570 eigen gegevens type. 336 00:15:35,570 --> 00:15:39,660 Maar ik ben ook met behulp van deze andere trefwoord riep struct die me een nieuwe geeft 337 00:15:39,660 --> 00:15:40,790 gegevensstructuur. 338 00:15:40,790 --> 00:15:43,980 >> En deze datastructuur Ik eis gaat twee dingen binnenin 339 00:15:43,980 --> 00:15:47,060 het - een string genaamd naam, en een string genaamd huis. 340 00:15:47,060 --> 00:15:49,820 En de naam die ik ga geven aan Deze gegevensstructuur gaat 341 00:15:49,820 --> 00:15:51,005 te noemen student. 342 00:15:51,005 --> 00:15:54,030 Ik kon het noemen wat ik wil, maar dit semantisch maken 343 00:15:54,030 --> 00:15:55,810 zin om mij in mijn gedachten. 344 00:15:55,810 --> 00:15:59,160 >> Dus nu, als ik open een betere versie van het programma dat ik begon te schrijven 345 00:15:59,160 --> 00:16:00,390 daar, laat mij gaat u naar de top. 346 00:16:00,390 --> 00:16:03,190 En er is nog meer regels code hier, maar laat me richten voor 347 00:16:03,190 --> 00:16:04,160 het ene moment. 348 00:16:04,160 --> 00:16:07,790 Ik heb een constante genaamd studenten verklaard en hard gecodeerd 3 voor nu. 349 00:16:07,790 --> 00:16:11,110 Maar nu, merken hoe schoon mijn code begint te krijgen. 350 00:16:11,110 --> 00:16:15,030 >> In lijn 22, verklaar ik serie van studenten. 351 00:16:15,030 --> 00:16:18,760 En merken dat student is blijkbaar nu een data type. 352 00:16:18,760 --> 00:16:23,360 Omdat op de top van dit bestand, merkt Ik heb begrepen dat de header file 353 00:16:23,360 --> 00:16:24,820 dat Ik trok slechts een moment geleden. 354 00:16:24,820 --> 00:16:28,820 En die header file gewoon had Deze definitie van een student. 355 00:16:28,820 --> 00:16:32,470 >> Dus nu heb ik mijn eigen aangepaste data gecreëerd type dat de auteurs van C jaar 356 00:16:32,470 --> 00:16:33,890 geleden dacht niet dat van te voren. 357 00:16:33,890 --> 00:16:34,570 Maar geen probleem. 358 00:16:34,570 --> 00:16:35,870 Ik kan het zelf maken. 359 00:16:35,870 --> 00:16:39,050 Dus dit is een matrix genoemd studenten, elk waarvan de leden 360 00:16:39,050 --> 00:16:41,100 is een student structuur. 361 00:16:41,100 --> 00:16:44,270 En ik wil drie van die in de array. 362 00:16:44,270 --> 00:16:46,030 >> En nu, wat doet de rest van dit programma doen? 363 00:16:46,030 --> 00:16:47,550 Ik iets een beetje arbitrair nodig. 364 00:16:47,550 --> 00:16:51,450 Dus van online 24 verder, Ik itereren van 0 tot 3. 365 00:16:51,450 --> 00:16:54,000 Toen ik de gebruiker te vragen de naam van de student. 366 00:16:54,000 --> 00:16:56,110 En dan gebruik ik getString als voorheen. 367 00:16:56,110 --> 00:16:59,410 Dan vraag ik voor het huis van de student, en ik getString als voorheen. 368 00:16:59,410 --> 00:17:01,780 >> Maar merk - iets nieuw stuk van de syntax - 369 00:17:01,780 --> 00:17:07,010 Ik kan nog steeds index aan de i-de student, maar hoe kom ik aan de specifieke data 370 00:17:07,010 --> 00:17:08,354 veld binnen de struct? 371 00:17:08,354 --> 00:17:11,770 Nou, wat is blijkbaar de nieuw stuk van syntax? 372 00:17:11,770 --> 00:17:13,339 Het is gewoon de puntoperator. 373 00:17:13,339 --> 00:17:14,510 >> We hebben niet echt eerder gezien. 374 00:17:14,510 --> 00:17:17,819 Je hebt het gezien in pset vijf als je hebt gedoken in reeds met bitmap-bestanden. 375 00:17:17,819 --> 00:17:22,372 Maar de stip betekent gewoon binnenkant van deze struct of meerdere velden, geven dot 376 00:17:22,372 --> 00:17:24,510 naam, of geef me dot huis. 377 00:17:24,510 --> 00:17:28,690 Dat betekent naar binnen gaan van de struct en krijgen die bepaalde gebieden. 378 00:17:28,690 --> 00:17:30,200 >> Wat doet de rest van dit programma doen? 379 00:17:30,200 --> 00:17:31,190 Het is niet zo sexy. 380 00:17:31,190 --> 00:17:34,640 Merk op dat ik weer herhalen van 0 tot 3, en ik gewoon maak een Engels 381 00:17:34,640 --> 00:17:40,500 frase als zo en zo is in dergelijke en zo'n huis, passeren in dot naam uit 382 00:17:40,500 --> 00:17:43,320 de i-de hun studenten en huis ook. 383 00:17:43,320 --> 00:17:47,560 >> En dan tot slot, nu we beginnen te krijgen anal over dit, nu we 384 00:17:47,560 --> 00:17:49,580 vertrouwd zijn met wat malloc en andere functies zijn 385 00:17:49,580 --> 00:17:50,570 doen al die tijd. 386 00:17:50,570 --> 00:17:54,220 Waarom moet ik zowel naam bevrijden en het huis, hoewel ik 387 00:17:54,220 --> 00:17:56,960 heb malloc niet bellen? 388 00:17:56,960 --> 00:17:58,020 >> GetString deed. 389 00:17:58,020 --> 00:18:00,930 En dat de dirty little secret voor was een aantal weken, maar GetString heeft 390 00:18:00,930 --> 00:18:03,530 gelekt geheugen over de hele plaats alle semester tot nu toe. 391 00:18:03,530 --> 00:18:05,990 En Valgrand zal uiteindelijk openbaren aan ons. 392 00:18:05,990 --> 00:18:10,730 >> Maar het is geen big deal, want ik weet dat ik gewoon kan bevrijden van de naam 393 00:18:10,730 --> 00:18:15,750 en het huis, hoewel technisch gezien, om super, super veilig, zou ik 394 00:18:15,750 --> 00:18:17,890 doen wat foutcontrole hier. 395 00:18:17,890 --> 00:18:19,040 Wat zijn uw instincten vertellen? 396 00:18:19,040 --> 00:18:22,480 Wat moet ik controleren voordat ik vrij wat is een 397 00:18:22,480 --> 00:18:25,470 koord, alias die een char *? 398 00:18:25,470 --> 00:18:33,460 >> Ik moet echt worden gecontroleerd of studenten beugel i dot naam niet 399 00:18:33,460 --> 00:18:34,840 gelijk nul. 400 00:18:34,840 --> 00:18:40,400 Dan is het wel OK zijn om vooruit en gratis gaan dat pointer, en dezelfde of andere 401 00:18:40,400 --> 00:18:41,160 een als goed. 402 00:18:41,160 --> 00:18:46,860 Als studenten beugel i dot huis is niet gelijk aan nul, dit nu zal beschermen 403 00:18:46,860 --> 00:18:52,520 tegen de hoek geval waarin GetString keert iets als null. 404 00:18:52,520 --> 00:18:57,310 En we zagen een moment geleden, printf zal bescherm ons hier door gewoon te zeggen 405 00:18:57,310 --> 00:18:58,990 null, die zal raar kijken. 406 00:18:58,990 --> 00:19:02,340 Maar in ieder geval zal het niet segfault, zoals we hebben gezien. 407 00:19:02,340 --> 00:19:05,990 >> Nou, laat mij een ding hier. structs-0 is een beetje een domme programma 408 00:19:05,990 --> 00:19:09,700 want ik voer al deze gegevens, en vervolgens het is verloren wanneer het programma eindigt. 409 00:19:09,700 --> 00:19:10,940 Maar laat me ga je gang en doe dit. 410 00:19:10,940 --> 00:19:12,830 Laat ik de terminal raam een ​​beetje groter. 411 00:19:12,830 --> 00:19:17,000 Laat me structs-1, die een nieuwe versie van. 412 00:19:17,000 --> 00:19:18,520 >> Ik zal inzoomen een beetje. 413 00:19:18,520 --> 00:19:21,620 En nu laat ik dot draaien slash structs-1. 414 00:19:21,620 --> 00:19:22,590 Naam van de student - 415 00:19:22,590 --> 00:19:31,500 David Mather, laten we het doen Rob Kirkland, laten we Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Wat interessant is, is nu bericht - 417 00:19:33,650 --> 00:19:35,540 en ik weet alleen dit omdat Ik schreef het programma - 418 00:19:35,540 --> 00:19:38,930 er is een bestand nu op mijn huidige directory genaamd students.csv. 419 00:19:38,930 --> 00:19:40,420 Sommigen van u zou kunnen hebben gezien deze in de echte wereld. 420 00:19:40,420 --> 00:19:42,980 >> Wat is een CSV-bestand? 421 00:19:42,980 --> 00:19:44,170 Comma-separated values. 422 00:19:44,170 --> 00:19:46,670 Het is een soort als een arme man versie van een Excel-bestand. 423 00:19:46,670 --> 00:19:50,580 Het is een tafel van rijen en kolommen die u kunt openen in een programma zoals Excel, 424 00:19:50,580 --> 00:19:51,800 of Numbers op een Mac. 425 00:19:51,800 --> 00:19:55,180 >> En als ik dit bestand hier openen op gedit, kennisgeving - en de getallen zijn er niet. 426 00:19:55,180 --> 00:19:57,360 Dat is gewoon gedit vertellen me regelnummers. 427 00:19:57,360 --> 00:19:59,740 Merkt op de eerste regel van dit bestand is David en Mather. 428 00:19:59,740 --> 00:20:01,450 De volgende regel is Rob komma Kirkland. 429 00:20:01,450 --> 00:20:04,170 En de derde lijn is Lauren komma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Dus wat heb ik gemaakt? 431 00:20:05,480 --> 00:20:09,580 Ik heb nu een C-programma geschreven dat effectief kunnen spreadsheets genereren 432 00:20:09,580 --> 00:20:11,840 die kan worden geopend in een programma zoals Excel. 433 00:20:11,840 --> 00:20:15,520 Niet al die dwingende een data set, maar als je veel grotere brokken van 434 00:20:15,520 --> 00:20:18,440 gegevens die u daadwerkelijk wilt manipuleren en maak grafieken van en de 435 00:20:18,440 --> 00:20:21,260 willen, is dit misschien wel een manier om die gegevens te maken. 436 00:20:21,260 --> 00:20:25,370 Bovendien CSV zijn eigenlijk super gemeenschappelijke net voor het opslaan van eenvoudige data - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, bijvoorbeeld, als je aandelenkoersen via hun zogenaamde 438 00:20:28,940 --> 00:20:33,180 API, de gratis service waarmee je krijg huidige up-to-the-date voorraad 439 00:20:33,180 --> 00:20:35,650 offertes voor bedrijven, ze de data terug te geven in de 440 00:20:35,650 --> 00:20:37,800 super eenvoudige CSV-formaat. 441 00:20:37,800 --> 00:20:39,380 >> Dus hoe hebben we dat gedaan? 442 00:20:39,380 --> 00:20:42,530 Wel merken, de meeste van deze programma's bijna hetzelfde. 443 00:20:42,530 --> 00:20:46,870 Maar let hier beneden, in plaats van druk de studenten uit, on line 35 444 00:20:46,870 --> 00:20:51,040 verder, ik beweer dat ik ben aan het sparen de studenten naar de schijf, dus een bestand op te slaan. 445 00:20:51,040 --> 00:20:53,630 >> Dus zie ik ben waarbij een FILE * - 446 00:20:53,630 --> 00:20:57,260 Nu, dit is een soort van een anomalie in C. Om wat voor reden, BESTAND hoofdletters, 447 00:20:57,260 --> 00:21:00,690 dat is niet zoals de meeste andere soorten gegevens in C. Maar dit is een ingebouwde 448 00:21:00,690 --> 00:21:02,320 datatype, FILE *. 449 00:21:02,320 --> 00:21:05,900 En ik ben waarbij een pointer naar een bestand, is hoe je kunt bedenken dat. 450 00:21:05,900 --> 00:21:08,070 >> fopen betekent geopend bestand. 451 00:21:08,070 --> 00:21:09,470 Wat bestand wilt u openen? 452 00:21:09,470 --> 00:21:12,620 Ik wil een bestand te openen dat zal ik doen willekeurig noemen students.csv. 453 00:21:12,620 --> 00:21:14,480 Ik kon dat alles wat ik wil noemen. 454 00:21:14,480 --> 00:21:15,200 >> En neem dan een gok. 455 00:21:15,200 --> 00:21:18,960 Wat doet het tweede argument om fopen waarschijnlijk betekenen? 456 00:21:18,960 --> 00:21:21,480 Rechts, w voor schrijven, kon worden r voor lezen. 457 00:21:21,480 --> 00:21:24,120 Er is een voor append als u willen rijen en niet toe te voegen 458 00:21:24,120 --> 00:21:25,200 overschrijven van de hele zaak. 459 00:21:25,200 --> 00:21:28,005 >> Maar ik wil gewoon dit bestand te maken een keer, dus ik citeer unquote w gebruiken. 460 00:21:28,005 --> 00:21:31,880 En ik weet dat alleen van te hebben gelezen de documentatie of de man pagina. 461 00:21:31,880 --> 00:21:35,100 Als het bestand niet null is - met andere woorden, als er niets mis ging er - 462 00:21:35,100 --> 00:21:37,820 laat me itereren over de studenten van 0 tot 3. 463 00:21:37,820 --> 00:21:40,410 >> En nu merkt dat er iets ooit zo iets anders 464 00:21:40,410 --> 00:21:42,110 over lijn 41 hier. 465 00:21:42,110 --> 00:21:42,960 Het is niet printf. 466 00:21:42,960 --> 00:21:46,530 Het is fprintf voor bestand printf. 467 00:21:46,530 --> 00:21:47,790 Dus het gaat om schrijven naar bestand. 468 00:21:47,790 --> 00:21:48,860 Welk bestand? 469 00:21:48,860 --> 00:21:53,630 Degene wiens aanwijzer die u opgeeft als eerste argument. 470 00:21:53,630 --> 00:21:55,940 >> Dan geven wij een format string. 471 00:21:55,940 --> 00:21:59,660 Dan geven wij wat snaar we willen plug in voor de eerste procent s, en 472 00:21:59,660 --> 00:22:04,320 dan nog een variabele of de tweede procent s. 473 00:22:04,320 --> 00:22:06,760 Sluit we het bestand met fclose. 474 00:22:06,760 --> 00:22:09,380 Dan ik vrij het geheugen als voorheen, alsof Ik zou terug gaan in en voeg 475 00:22:09,380 --> 00:22:10,540 sommige controles voor null. 476 00:22:10,540 --> 00:22:12,090 >> En dat is het. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose geeft mij de mogelijkheid om tekstbestanden te maken. 478 00:22:16,960 --> 00:22:19,640 Nu, zie je in de problemen set vijf, welke beelden gaat, zult u met behulp van 479 00:22:19,640 --> 00:22:20,990 binaire bestanden in plaats. 480 00:22:20,990 --> 00:22:24,200 Maar fundamenteel, het idee is hetzelfde, hoewel de functies die u zult 481 00:22:24,200 --> 00:22:28,710 zien zijn een beetje anders. 482 00:22:28,710 --> 00:22:32,580 >> Dus wervelwind tour, maar je krijgt maar al te bekend met file I/O-- 483 00:22:32,580 --> 00:22:34,960 input en output - met pset vijf. 484 00:22:34,960 --> 00:22:38,607 En vragen over de initiële basics hier? 485 00:22:38,607 --> 00:22:39,857 Yeah? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Wat als je probeert om een ​​null-waarde te bevrijden? 488 00:22:43,710 --> 00:22:48,880 Ik geloof, tenzij gratis heeft gekregen een beetje meer gebruikersvriendelijk, kunt u 489 00:22:48,880 --> 00:22:49,890 potentieel segfault. 490 00:22:49,890 --> 00:22:54,160 Het doorgeven null is slecht omdat ik niet geloof vrij stoort om te controleren voor u, 491 00:22:54,160 --> 00:22:57,330 omdat het mogelijk zou zijn een verspilling tijd om zich ervan te doen 492 00:22:57,330 --> 00:22:59,022 iedereen in de wereld. 493 00:22:59,022 --> 00:23:00,590 Goede vraag, dat wel. 494 00:23:00,590 --> 00:23:04,300 >> Oke, dus dit soort krijgt ons naar een interessant onderwerp. 495 00:23:04,300 --> 00:23:07,010 Het thema van het probleem set vijf is forensisch onderzoek. 496 00:23:07,010 --> 00:23:08,420 Dat is tenminste een gedeelte van de probleemstelling. 497 00:23:08,420 --> 00:23:12,030 Forensics algemeen verwijst naar de herstel van de informatie die al dan 498 00:23:12,030 --> 00:23:14,110 mogen niet zijn verwijderd bewust. 499 00:23:14,110 --> 00:23:18,680 En dus ik dacht dat ik je een korte voorproefje van wat er echt gaande is alle 500 00:23:18,680 --> 00:23:21,230 ditmaal onder het motorkap van uw computer. 501 00:23:21,230 --> 00:23:23,960 >> Bijvoorbeeld, als je de binnenkant van je laptop of desktop computer een 502 00:23:23,960 --> 00:23:28,040 harde schijf, het is ofwel een mechanisch apparaat dat eigenlijk spint - 503 00:23:28,040 --> 00:23:31,650 er is circulaire dingen genoemd platters dat nogal uitzien als wat ik 504 00:23:31,650 --> 00:23:34,540 net op het scherm hier, hoewel Dit is steeds old school. 505 00:23:34,540 --> 00:23:37,370 Dit is een drie-en-een-half-inch harde schijf. 506 00:23:37,370 --> 00:23:40,070 En drie en een halve centimeter verwijst van met het ding als je het installeert 507 00:23:40,070 --> 00:23:40,890 in een computer. 508 00:23:40,890 --> 00:23:44,890 >> Velen van jullie nu in uw laptops hebben solid-state drives, of SSD's, 509 00:23:44,890 --> 00:23:46,260 tegenkomen die geen bewegende delen. 510 00:23:46,260 --> 00:23:49,170 Ze zijn meer zoals RAM en minder als deze mechanische inrichtingen. 511 00:23:49,170 --> 00:23:51,450 Maar de ideeën zijn nog steeds hetzelfde, beslist zij betrekking 512 00:23:51,450 --> 00:23:52,790 om probleem stellen vijf. 513 00:23:52,790 --> 00:23:57,400 >> En als je erover nadenkt nu een harde schijf vertegenwoordigt zijnde een cirkel, die 514 00:23:57,400 --> 00:23:58,930 Ik zal hier tekenen als deze. 515 00:23:58,930 --> 00:24:02,290 Wanneer u een bestand op uw computer te maken, of het nu een SSD, of in 516 00:24:02,290 --> 00:24:06,610 dit geval een oudere school-harde schijf, dat bestand bestaat uit meerdere bits. 517 00:24:06,610 --> 00:24:10,510 Laten we zeggen dat het is dit 0 en 1, een hele hoop van 0s en 1s. 518 00:24:10,510 --> 00:24:11,660 Dit is dus mijn hele harde schijf. 519 00:24:11,660 --> 00:24:13,225 Dit is blijkbaar een vrij groot bestand. 520 00:24:13,225 --> 00:24:18,080 En het is met behulp van de 0s en 1s op dat deel van de fysieke platter. 521 00:24:18,080 --> 00:24:19,750 >> Nou, wat is dat fysieke gedeelte? 522 00:24:19,750 --> 00:24:25,310 Nou, het blijkt dat op een harde schijf, althans van dit type is er 523 00:24:25,310 --> 00:24:27,340 deze minuscule kleine magnetische deeltjes. 524 00:24:27,340 --> 00:24:32,630 En ze wezen moeten noorden en zuidpool aan hen, zodat als je 525 00:24:32,630 --> 00:24:35,710 draai een van die magnetische deeltjes op deze manier, zou je kunnen zeggen dat het 526 00:24:35,710 --> 00:24:36,720 die een 1. 527 00:24:36,720 --> 00:24:39,340 En als het ondersteboven zuiden naar noorden, zou je kunnen zeggen dat het 528 00:24:39,340 --> 00:24:40,390 wat neerkomt op een 0. 529 00:24:40,390 --> 00:24:43,660 >> Dus in de echte fysieke wereld, dat is hoe je iets in zou kunnen vertegenwoordigen 530 00:24:43,660 --> 00:24:45,670 binaire toestand van de 0 en een 1. 531 00:24:45,670 --> 00:24:46,720 Dus dat is al een bestand is. 532 00:24:46,720 --> 00:24:49,300 Er is een hele hoop van magnetische deeltjes dat hun op deze manier of zijn 533 00:24:49,300 --> 00:24:51,920 op deze manier, het creëren van patronen van 0s en 1s. 534 00:24:51,920 --> 00:24:56,760 >> Maar het blijkt dat wanneer u een bestand opslaat, wat informatie wordt apart opgeslagen. 535 00:24:56,760 --> 00:25:00,000 Dus dit is een kleine tafel, een directory, zo te zeggen. 536 00:25:00,000 --> 00:25:05,810 En ik zal deze kolom naam noemen, en Ik zal deze kolom te bellen. 537 00:25:05,810 --> 00:25:08,850 >> En ik ga zeggen, veronderstel dit is mijn CV. 538 00:25:08,850 --> 00:25:14,050 Mijn RESUME.DOC wordt opgeslagen bij locatie, laten we zeggen 123. 539 00:25:14,050 --> 00:25:15,390 Ik kies altijd voor dat nummer. 540 00:25:15,390 --> 00:25:18,810 Maar het volstaat te zeggen dat, net als in het RAM, kunt u een harde schijf te nemen 541 00:25:18,810 --> 00:25:22,350 dat is een gigabyte of 200 gigabytes of een terabyte, en je kan 542 00:25:22,350 --> 00:25:23,750 nummer al van de bytes. 543 00:25:23,750 --> 00:25:26,480 U zal kunnen tellen alle stukjes van 8 bits. 544 00:25:26,480 --> 00:25:29,030 >> Dus we zullen zeggen dat dit is locatie 123. 545 00:25:29,030 --> 00:25:32,070 Dus deze directory binnenkant van mijn besturingssysteem systeem onthoudt dat mijn 546 00:25:32,070 --> 00:25:34,250 CV is op locatie 123. 547 00:25:34,250 --> 00:25:36,850 Maar het wordt interessant wanneer je een bestand verwijdert. 548 00:25:36,850 --> 00:25:37,820 >> Dus bijvoorbeeld - 549 00:25:37,820 --> 00:25:40,790 en gelukkig, het grootste deel van de wereld heeft gevangen op dit - wat er gebeurt als 550 00:25:40,790 --> 00:25:45,040 u een bestand sleept naar uw Mac OS Prullenbak of uw Windows Prullenbak? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Wat is het doel van dat te doen? 553 00:25:50,510 --> 00:25:53,860 Het is natuurlijk om zich te ontdoen van het bestand, maar wat doet de handeling van het slepen en 554 00:25:53,860 --> 00:25:57,550 te laten vallen in uw prullenbak of uw Prullenbak doen op een computer? 555 00:25:57,550 --> 00:25:59,230 >> Absoluut niets, echt. 556 00:25:59,230 --> 00:26:00,320 Het is net als een map. 557 00:26:00,320 --> 00:26:01,800 Het is een speciale map, om zeker te zijn. 558 00:26:01,800 --> 00:26:04,460 Maar is het eigenlijk het bestand te verwijderen? 559 00:26:04,460 --> 00:26:06,780 >> Nou, nee, want sommigen van u waarschijnlijk hebben zoals geweest, oh damn, dat deed je niet 560 00:26:06,780 --> 00:26:07,420 betekenen om dat te doen. 561 00:26:07,420 --> 00:26:09,130 Zodat u dubbelklikt op het Prullenmand. 562 00:26:09,130 --> 00:26:11,630 Je hebt gepord rond en je hebt hersteld het bestand gewoon door het te slepen 563 00:26:11,630 --> 00:26:12,110 er uit. 564 00:26:12,110 --> 00:26:14,420 Zo duidelijk, het is niet per se verwijderen. 565 00:26:14,420 --> 00:26:15,990 >> OK, je bent slimmer dan dat. 566 00:26:15,990 --> 00:26:18,860 U weet dat het juist in het slepen Prullenbak of Prullenbak betekent niet 567 00:26:18,860 --> 00:26:19,930 je bent het legen van de prullenbak. 568 00:26:19,930 --> 00:26:24,110 Dus ga je naar het menu, en je zegt Prullenbak leegmaken of Prullenbak leegmaken. 569 00:26:24,110 --> 00:26:25,360 Wat gebeurt er dan? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ja, dus het is meer zo verwijderd. 572 00:26:32,530 --> 00:26:37,660 Maar alles wat er gebeurt is het volgende. 573 00:26:37,660 --> 00:26:45,350 De computer vergeet waar RESUME.DOC was. 574 00:26:45,350 --> 00:26:47,400 >> Maar wat is er blijkbaar niet veranderd op de foto? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 De bits, de 0s en 1s dat ik beweren zijn op het terrein van een aantal fysieke aspect van 577 00:26:55,570 --> 00:26:56,280 de hardware. 578 00:26:56,280 --> 00:26:57,110 Ze zijn er nog steeds. 579 00:26:57,110 --> 00:26:58,930 Het is gewoon de computer heeft vergeten wat ze zijn. 580 00:26:58,930 --> 00:27:03,160 >> Dus het is in wezen bevrijd van het bestand stukjes zodat zij kunnen worden hergebruikt. 581 00:27:03,160 --> 00:27:06,940 Maar niet totdat je meer bestanden maken, en meer bestanden en meer bestanden zullen 582 00:27:06,940 --> 00:27:12,150 probabilistisch, die 0s en 1s, die magnetische deeltjes, word hergebruikt, 583 00:27:12,150 --> 00:27:16,220 ondersteboven of rechtop, voor andere bestanden, 0s en 1s. 584 00:27:16,220 --> 00:27:17,980 >> Dus je hebt dit venster van de tijd. 585 00:27:17,980 --> 00:27:19,860 En het is niet van voorspelbare lengte, echt. 586 00:27:19,860 --> 00:27:22,240 Het hangt af van de grootte van uw harde rijden en hoeveel bestanden je hebt en 587 00:27:22,240 --> 00:27:23,490 hoe snel je nieuwe te maken. 588 00:27:23,490 --> 00:27:27,050 Maar er is een venster van de tijd tijdens die dat bestand is nog steeds perfect 589 00:27:27,050 --> 00:27:27,770 vergoeding in aanmerking. 590 00:27:27,770 --> 00:27:31,050 >> Dus als je ooit gebruik maken programma's als McAfee of Norton om te proberen te herstellen 591 00:27:31,050 --> 00:27:35,680 gegevens, alles wat ze doen is proberen om herstellen van deze zogenaamde directory te 592 00:27:35,680 --> 00:27:37,340 erachter te komen waar uw bestand was. 593 00:27:37,340 --> 00:27:40,605 En soms Norton en zal zeggen, bestand is 93% herbruikbaar. 594 00:27:40,605 --> 00:27:42,020 Nou, wat betekent dat? 595 00:27:42,020 --> 00:27:45,690 Dat betekent gewoon dat een ander bestand toevallig belandde met, zeg, 596 00:27:45,690 --> 00:27:48,920 die stukjes uit je oorspronkelijke bestand. 597 00:27:48,920 --> 00:27:51,950 >> Dus wat er werkelijk betrokken in het herstellen van gegevens? 598 00:27:51,950 --> 00:27:55,720 Nou, als je niet zoiets hebben Norton vooraf geïnstalleerd op uw computer, 599 00:27:55,720 --> 00:27:59,510 het beste wat je kunt soms doen is kijken op de hele harde schijf op zoek naar 600 00:27:59,510 --> 00:28:00,510 patronen van bits. 601 00:28:00,510 --> 00:28:05,350 En een van de thema's van het probleem set vijf is dat je zal zoeken de 602 00:28:05,350 --> 00:28:09,570 equivalent van een harde schijf, een forensisch beeld van een compact flash kaart van een 603 00:28:09,570 --> 00:28:13,660 digitale camera, op zoek naar de 0s en 1s die typisch met hoge 604 00:28:13,660 --> 00:28:16,720 waarschijnlijkheid, vertegenwoordigen begin een JPEG-beeld. 605 00:28:16,720 --> 00:28:21,120 >> En jullie kunnen herstellen die beelden door veronderstelling, als ik zie dit patroon van 606 00:28:21,120 --> 00:28:24,380 bits op de forensische afbeelding, met hoge waarschijnlijkheid, dat markeert 607 00:28:24,380 --> 00:28:25,650 de start van een JPEG. 608 00:28:25,650 --> 00:28:29,520 En als ik zie hetzelfde patroon weer, dat waarschijnlijk markeert het begin van 609 00:28:29,520 --> 00:28:32,440 andere JPEG en andere JPEG en andere JPEG. 610 00:28:32,440 --> 00:28:34,970 En dit is typisch hoe data recovery zal werken. 611 00:28:34,970 --> 00:28:37,870 Wat is er leuk aan JPEG's is ook al het bestandsformaat zelf enigszins 612 00:28:37,870 --> 00:28:44,400 complex, het begin van elk zodanig bestand is eigenlijk vrij herkenbaar 613 00:28:44,400 --> 00:28:47,370 en eenvoudig, zoals u zult zien, Als je hebt nog niet. 614 00:28:47,370 --> 00:28:50,270 >> Dus laten we eens een kijkje eronder de afzuigkap aan wat is geweest 615 00:28:50,270 --> 00:28:53,360 gaande is, en wat deze 0s en 1s zijn, om u een beetje meer van een te geven 616 00:28:53,360 --> 00:28:55,330 context voor deze uitdaging. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEO AFSPELEN] 618 00:28:55,510 --> 00:28:58,700 >> -Waar je PC meeste slaat van haar vaste data. 619 00:28:58,700 --> 00:29:03,390 Om dat te doen, de gegevens reist van RAM samen met software signalen die vertellen 620 00:29:03,390 --> 00:29:06,110 de harde schijf hoe die gegevens op te slaan. 621 00:29:06,110 --> 00:29:09,410 De harde schijf circuits vertalen deze signalen in elektrische spanning 622 00:29:09,410 --> 00:29:10,870 schommelingen. 623 00:29:10,870 --> 00:29:14,970 Deze op zijn beurt, de controle van de harde schijf bewegende delen, enkele weinig 624 00:29:14,970 --> 00:29:17,910 bewegende delen links in de moderne computer. 625 00:29:17,910 --> 00:29:22,130 >> Sommige besturingssignalen een motor welk metaal-gecoate platters spint. 626 00:29:22,130 --> 00:29:25,470 Uw data wordt daadwerkelijk opgeslagen op deze schotels. 627 00:29:25,470 --> 00:29:28,610 Andere signalen bewegen het lezen / schrijven koppen te lezen of 628 00:29:28,610 --> 00:29:30,710 schrijven van gegevens op de platters. 629 00:29:30,710 --> 00:29:35,450 Deze machines zo nauwkeurig dat een mens haar kon zelfs niet passeren tussen de 630 00:29:35,450 --> 00:29:37,280 hoofden en spinnen platters. 631 00:29:37,280 --> 00:29:40,316 Maar toch, het werkt allemaal op geweldige snelheden. 632 00:29:40,316 --> 00:29:40,660 >> [END VIDEO AFSPELEN] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Zoom in een klein dieper nu naar wat 634 00:29:42,190 --> 00:29:44,360 daadwerkelijk op die platters. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEO AFSPELEN] 636 00:29:44,720 --> 00:29:47,660 >> -Laten we eens kijken naar wat we net zag in slow motion. 637 00:29:47,660 --> 00:29:51,710 Bij een korte puls van elektriciteit is aan de lees / schrijfkop, indien flips 638 00:29:51,710 --> 00:29:54,650 op een kleine elektromagnetische voor een fractie van een seconde. 639 00:29:54,650 --> 00:29:58,970 De magneet zorgt voor een gebied, dat verandert de polariteit van een klein, klein 640 00:29:58,970 --> 00:30:02,850 gedeelte van de metaaldeeltjes die coat elke platter oppervlak. 641 00:30:02,850 --> 00:30:05,940 >> Een patroon reeks van deze kleine, gebracht-up gebieden op de schijf 642 00:30:05,940 --> 00:30:08,470 betekent een bit van gegevens in het binaire getal 643 00:30:08,470 --> 00:30:10,530 dat door computers. 644 00:30:10,530 --> 00:30:13,775 Nu, wanneer de stroom wordt gestuurd op een manier door de lees / schrijfkop, de stippellijn 645 00:30:13,775 --> 00:30:15,970 is gepolariseerd in een richting. 646 00:30:15,970 --> 00:30:17,950 Als de stroom wordt verzonden in de tegenovergestelde richting, de 647 00:30:17,950 --> 00:30:19,930 polarisatie omgekeerd. 648 00:30:19,930 --> 00:30:22,370 >> Hoe u gegevens van de harde schijf te krijgen? 649 00:30:22,370 --> 00:30:24,090 Gewoon het proces omkeren. 650 00:30:24,090 --> 00:30:26,550 Dus het is de deeltjes op de schijf dat de huidige te krijgen in de 651 00:30:26,550 --> 00:30:27,960 lees / schrijfkop beweegt. 652 00:30:27,960 --> 00:30:30,700 Zet samen miljoenen van deze gemagnetiseerd segmenten en 653 00:30:30,700 --> 00:30:32,160 je hebt een bestand. 654 00:30:32,160 --> 00:30:36,060 >> Nu, de stukjes van een bestand kan worden verspreid over een schijf 655 00:30:36,060 --> 00:30:39,970 schotels, zoiets als de puinhoop papieren op uw bureau. 656 00:30:39,970 --> 00:30:43,500 Dus een speciale extra bestand houdt de sporen van waar alles is. 657 00:30:43,500 --> 00:30:45,985 Heb je niet willen dat je had zoiets? 658 00:30:45,985 --> 00:30:46,470 >> [END VIDEO AFSPELEN] 659 00:30:46,470 --> 00:30:47,820 >> DAVID MALAN: OK, waarschijnlijk niet. 660 00:30:47,820 --> 00:30:52,070 Dus hoeveel van jullie opgegroeid met deze? 661 00:30:52,070 --> 00:30:53,970 OK, dus het is minder en minder handen ieder jaar. 662 00:30:53,970 --> 00:30:56,550 Maar ik ben blij dat je op zijn minst vertrouwd met hen, omdat deze en onze eigen 663 00:30:56,550 --> 00:31:00,520 boek demo, helaas, sterven een zeer langzame dood hier van vertrouwdheid. 664 00:31:00,520 --> 00:31:04,010 >> Maar dit is wat ik althans weer middelbare school, gebruikt gebruik voor back-ups. 665 00:31:04,010 --> 00:31:08,110 En het was geweldig, want je 1.4 megabytes kunnen opslaan op 666 00:31:08,110 --> 00:31:08,930 dit disk. 667 00:31:08,930 --> 00:31:12,260 Dit was de hoge dichtheid versie zoals aangegeven door de HD, dat is 668 00:31:12,260 --> 00:31:14,240 wat betekent dat voor de huidige HD-video's. 669 00:31:14,240 --> 00:31:16,400 >> Standaard dichtheid was 800 kilobytes. 670 00:31:16,400 --> 00:31:18,640 En daarvoor waren er 400-kilobyte schijven. 671 00:31:18,640 --> 00:31:23,120 En daarvoor, waren er 5 en 1/4 inch schijven, die echt slap waren, 672 00:31:23,120 --> 00:31:25,680 en een beetje breder en hoger dan deze dingen hier. 673 00:31:25,680 --> 00:31:29,150 Maar je kunt eigenlijk zien de zogenaamde floppy aspect van deze schijven. 674 00:31:29,150 --> 00:31:32,630 >> En functioneel, ze zijn eigenlijk redelijk vergelijkbaar met harde schijven van ten 675 00:31:32,630 --> 00:31:33,570 tenminste dit type. 676 00:31:33,570 --> 00:31:37,270 Nogmaals, SSD's in nieuwere computers werkt een beetje anders. 677 00:31:37,270 --> 00:31:41,530 Maar als je dat tabblad kleine metalen bewegen, je daadwerkelijk kunt zien een beetje koekje, 678 00:31:41,530 --> 00:31:42,560 of schotel. 679 00:31:42,560 --> 00:31:43,830 >> Het is niet metal zoals deze. 680 00:31:43,830 --> 00:31:46,000 Deze is eigenlijk een goedkoper kunststof. 681 00:31:46,000 --> 00:31:46,750 En je kan soort wiebelen het. 682 00:31:46,750 --> 00:31:50,310 En je hebt trully net geveegd enkele aantal bits of magnetische deeltjes 683 00:31:50,310 --> 00:31:51,220 van deze schijf. 684 00:31:51,220 --> 00:31:52,710 >> Zo gelukkig, er is niets op. 685 00:31:52,710 --> 00:31:55,790 Als dat ding in de weg - en bedek uw ogen en die van uw buurman - 686 00:31:55,790 --> 00:31:58,865 je kunt gewoon een soort van trekken deze hele omhulsel eraf als dat. 687 00:31:58,865 --> 00:32:01,900 Maar er is een beetje lente, dus wees bewust van dat met je ogen. 688 00:32:01,900 --> 00:32:03,620 Dus nu heb je echt een diskette. 689 00:32:03,620 --> 00:32:07,090 >> En wat is er opmerkelijk aan deze dat voor zover het een 690 00:32:07,090 --> 00:32:10,830 kleinschalige voorstelling van een grotere harde schijf, deze dingen zijn super, 691 00:32:10,830 --> 00:32:11,590 super eenvoudig. 692 00:32:11,590 --> 00:32:15,170 Als je de onderkant van het knijpen, nu dat dat metalen ding is af, en schil 693 00:32:15,170 --> 00:32:20,990 ze open, alles wat er is twee stukken vilt en de zogenaamde floppy disk 694 00:32:20,990 --> 00:32:22,930 met een stuk metaal aan de binnenkant. 695 00:32:22,930 --> 00:32:25,990 >> En daar gaat de helft van de inhoud van mijn schijf. 696 00:32:25,990 --> 00:32:27,540 Daar gaat weer de helft van hen. 697 00:32:27,540 --> 00:32:31,375 Maar dat is alles wat draaide binnen van uw computer in weleer. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> En nogmaals, om dit in perspectief te zetten, hoe groot is het grootste deel van uw 700 00:32:38,310 --> 00:32:39,560 harde schijven tegenwoordig? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabyte, een terabyte, misschien in een desktop computer, 2 terabyte, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabyte, toch? 704 00:32:47,630 --> 00:32:52,480 Dit is een megabyte, geven of te nemen, die zelfs niet kan passen in een typische MP3 705 00:32:52,480 --> 00:32:55,310 meer deze dagen, of een soortgelijke muziekbestand. 706 00:32:55,310 --> 00:32:59,500 >> Dus een beetje souvenir voor u vandaag, en ook om te helpen contextualiseren wat 707 00:32:59,500 --> 00:33:03,570 We nemen voor lief nu in de problemen van de vijf. 708 00:33:03,570 --> 00:33:04,820 Dus dat zijn jou te houden. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Dus laat ik de overgang naar waar zal zijn de besteding van de volgende pset ook. 711 00:33:13,370 --> 00:33:18,470 Dus we hebben nu ingesteld deze pagina voor - oh, een paar aankondigingen snel. 712 00:33:18,470 --> 00:33:21,730 >> Deze vrijdag, als je zou willen aansluiten CS50 voor de lunch, ga dan naar de gebruikelijke plaats, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 En laatste project - 715 00:33:25,100 --> 00:33:28,520 dus per de syllabus, hebben we postte de afstudeerproject specificatie reeds. 716 00:33:28,520 --> 00:33:31,410 Realiseer je dat dat betekent niet dat het is te wijten bijzonder snel. 717 00:33:31,410 --> 00:33:33,990 Het is geplaatst, echt, alleen maar om jullie denken. 718 00:33:33,990 --> 00:33:37,620 En inderdaad, een super significant percentage van jullie zullen aanpakken 719 00:33:37,620 --> 00:33:40,780 afstudeerprojecten op materiaal dat we zijn nog niet eens gekregen om in de klas, 720 00:33:40,780 --> 00:33:42,730 maar zal zo vroeg volgende week. 721 00:33:42,730 --> 00:33:45,530 >> Mededeling, hoewel, dat de spec vraagt ​​om een paar verschillende onderdelen van de 722 00:33:45,530 --> 00:33:46,190 afstudeerproject. 723 00:33:46,190 --> 00:33:49,590 De eerste, in een paar weken, een pre-voorstel, een vrij casual email naar 724 00:33:49,590 --> 00:33:52,760 uw TF om hem te vertellen of wat je bent na te denken over voor uw project, met 725 00:33:52,760 --> 00:33:53,650 Geen langdurige verbintenissen. 726 00:33:53,650 --> 00:33:56,710 Voorstel zal uw specifieke commitment, zeggende, hier, dit is wat 727 00:33:56,710 --> 00:33:57,770 Ik zou willen doen voor mijn project. 728 00:33:57,770 --> 00:33:58,250 Wat denk je? 729 00:33:58,250 --> 00:33:58,650 Te groot? 730 00:33:58,650 --> 00:33:59,145 Te klein? 731 00:33:59,145 --> 00:34:00,330 Is het beheersbaar? 732 00:34:00,330 --> 00:34:02,230 En zie je de spec voor meer details. 733 00:34:02,230 --> 00:34:05,060 >> Een paar weken na dat is de status verslag dat een soortgelijke 734 00:34:05,060 --> 00:34:08,260 toevallige email naar uw TF te zeggen hoe ver achter je in je laatste 735 00:34:08,260 --> 00:34:12,360 project implementatie, gevolgd door de CS50 Hackathon waaraan iedereen 736 00:34:12,360 --> 00:34:17,520 is uitgenodigd, die zal een gebeurtenis uit zijn 20:00 Op een avond tot 07:00 737 00:34:17,520 --> 00:34:19,150 AM de volgende ochtend. 738 00:34:19,150 --> 00:34:22,560 Pizza, zoals ik in de week kunnen zijn genoemd nul, zul worden geserveerd op 09:00, 739 00:34:22,560 --> 00:34:24,120 Chinees eten in 01:00. 740 00:34:24,120 --> 00:34:27,929 En als je nog wakker om 5:00 AM, we brengen je naar IHOP voor het ontbijt. 741 00:34:27,929 --> 00:34:31,310 >> Dus Hackathon is een van de meer memorabele ervaringen in de klas. 742 00:34:31,310 --> 00:34:35,290 Dan is de uitvoering te wijten, en dan is de climax CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Meer informatie over al deze in de komende weken. 744 00:34:38,070 --> 00:34:40,739 >> Maar laten we terug gaan naar iets oude school - 745 00:34:40,739 --> 00:34:41,920 weer een array. 746 00:34:41,920 --> 00:34:45,040 Dus een array was leuk, want het lost problemen, zoals we zagen slechts een 747 00:34:45,040 --> 00:34:49,290 daarnet met student structuren een beetje uit de hand als we 748 00:34:49,290 --> 00:34:52,405 willen student een, student twee, hebben student drie, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 een willekeurig aantal studenten. 750 00:34:54,400 --> 00:34:58,850 >> Dus arrays, een paar weken geleden, dook in en opgelost al onze problemen van niet 751 00:34:58,850 --> 00:35:03,340 van tevoren te weten hoeveel dingen van een soort we zouden willen. 752 00:35:03,340 --> 00:35:07,390 En we hebben gezien dat structs ons kan helpen onze code verder te organiseren en te houden 753 00:35:07,390 --> 00:35:11,660 begripsmatig overeenstemmen variabelen, zoals een naam en een huis, samen, zodat we 754 00:35:11,660 --> 00:35:15,570 kunnen ze te behandelen als een entiteit, binnen waarvan er kleinere stukken. 755 00:35:15,570 --> 00:35:17,810 >> Maar arrays hebben een aantal nadelen. 756 00:35:17,810 --> 00:35:19,780 Wat zijn de nadelen we hebben ondervonden 757 00:35:19,780 --> 00:35:22,320 met arrays dusver? 758 00:35:22,320 --> 00:35:23,450 Wat is dat? 759 00:35:23,450 --> 00:35:28,130 Vaste grootte - dus zelfs al heb je misschien kunt geheugen toewijzen voor een 760 00:35:28,130 --> 00:35:32,310 array, als je eenmaal weet hoeveel studenten je hebt, hoeveel tekens je hebt 761 00:35:32,310 --> 00:35:35,460 van de gebruiker, als je eenmaal hebt toegewezen de array, je hebt soort van geschilderde 762 00:35:35,460 --> 00:35:36,740 jezelf in een hoek. 763 00:35:36,740 --> 00:35:40,600 >> Omdat je nieuwe elementen niet kan invoegen in het midden van een array. 764 00:35:40,600 --> 00:35:43,660 U kunt geen meer elementen aan het einde van een array. 765 00:35:43,660 --> 00:35:47,750 Echt, moet je toevlucht nemen tot het creëren van een geheel nieuwe serie, zoals we hebben besproken, 766 00:35:47,750 --> 00:35:49,320 kopiëren van de oude naar de nieuwe. 767 00:35:49,320 --> 00:35:52,610 En nogmaals, dat is de hoofdpijn die GetString behandelt voor u. 768 00:35:52,610 --> 00:35:56,170 >> Maar nogmaals, je kunt niet eens invoegen iets in het midden van de array 769 00:35:56,170 --> 00:35:58,200 Als de prijs is niet helemaal gevuld. 770 00:35:58,200 --> 00:36:03,010 Bijvoorbeeld, als deze array hier omvang zes heeft slechts vijf dingen erin, 771 00:36:03,010 --> 00:36:06,080 goed, je kon gewoon overstag iets op het einde. 772 00:36:06,080 --> 00:36:08,200 Maar wat als je iets wilt invoegen in het midden van de 773 00:36:08,200 --> 00:36:11,280 matrix, hoewel het misschien vijf van de zes dingen in het? 774 00:36:11,280 --> 00:36:14,250 >> Nou, wat hebben we gedaan toen we hadden allemaal van onze menselijke vrijwilligers op het podium in 775 00:36:14,250 --> 00:36:15,110 weken voorbij? 776 00:36:15,110 --> 00:36:18,710 Als we wilden iemand hier zetten, ofwel deze mensen hoe dit te verplaatsen 777 00:36:18,710 --> 00:36:22,540 manier, of deze mensen hoe dit te verplaatsen manier, en dat werd duurder. 778 00:36:22,540 --> 00:36:26,950 De verschuiving van mensen binnen een serie eindigde het optellen en kostprijsberekening 779 00:36:26,950 --> 00:36:31,240 ons tijd, dus veel van onze n kwadraat looptijden zoals insertion sort, voor 780 00:36:31,240 --> 00:36:32,550 Bijvoorbeeld, in het ergste geval. 781 00:36:32,550 --> 00:36:36,520 Dus arrays zijn geweldig, maar je moet tevoren weten hoe groot je ze wilt. 782 00:36:36,520 --> 00:36:38,030 >> Nou ja, hier is een oplossing. 783 00:36:38,030 --> 00:36:43,860 Als ik niet weet op voorhand hoeveel studenten die ik zou kunnen hebben, en ik weet dat een keer 784 00:36:43,860 --> 00:36:47,870 Ik besluit, hoewel, ik zit vast met die veel studenten, waarom ik niet gewoon altijd 785 00:36:47,870 --> 00:36:51,740 toewijzen twee keer zoveel ruimte als ik zou denken ik nodig? 786 00:36:51,740 --> 00:36:54,450 Is dat niet een redelijke oplossing? 787 00:36:54,450 --> 00:36:58,240 >> Realistisch, ik denk niet dat dat we gaat meer dan 50 slots nodig 788 00:36:58,240 --> 00:37:02,190 in een array voor een middelgrote klasse, dus laten we gewoon naar boven afronden. 789 00:37:02,190 --> 00:37:07,040 Ik zal 100 sleuven te maken in mijn array, net zodat we kunnen zeker de 790 00:37:07,040 --> 00:37:10,330 aantal studenten verwacht ik in sommige middelgrote klasse. 791 00:37:10,330 --> 00:37:14,320 Dus waarom niet gewoon afronden en toewijzen meer geheugen, typisch voor een serie 792 00:37:14,320 --> 00:37:16,290 dan u denkt u misschien nog nodig? 793 00:37:16,290 --> 00:37:20,190 Wat is dit eenvoudige pushback aan dat idee? 794 00:37:20,190 --> 00:37:21,440 >> Je bent gewoon verspilt geheugen. 795 00:37:21,440 --> 00:37:25,350 Letterlijk elk programma dat u dan schrijven is misschien wel twee keer zoveel geheugen als 796 00:37:25,350 --> 00:37:26,680 je eigenlijk nodig hebt. 797 00:37:26,680 --> 00:37:28,990 En dat voelt niet als een bijzonder elegante oplossing. 798 00:37:28,990 --> 00:37:31,990 Bovendien vermindert alleen de waarschijnlijkheid van een probleem. 799 00:37:31,990 --> 00:37:35,300 Als je toevallig een populaire cursus hebben een semester en je hebt 101 800 00:37:35,300 --> 00:37:39,610 studenten, het programma is nog steeds fundamenteel geconfronteerd met hetzelfde probleem. 801 00:37:39,610 --> 00:37:44,280 >> Zo gelukkig, er is een oplossing voor Deze advertentie al onze problemen in de vorm 802 00:37:44,280 --> 00:37:46,790 van datastructuren die complexer dan die 803 00:37:46,790 --> 00:37:47,970 we hebben tot nu toe gezien. 804 00:37:47,970 --> 00:37:50,530 Dit, ik beweer, is een gelinkte lijst. 805 00:37:50,530 --> 00:37:51,920 Dit is een lijst met nummers - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, en 34 - 807 00:37:54,970 --> 00:38:00,120 die zijn met elkaar verbonden door van wat ik heb getekend als pijlen. 808 00:38:00,120 --> 00:38:03,580 >> Met andere woorden, als ik wilde vertegenwoordigen een array, kon ik doen 809 00:38:03,580 --> 00:38:04,910 zoiets als dit. 810 00:38:04,910 --> 00:38:07,310 En ik zal dit op de overhead in slechts een moment. 811 00:38:07,310 --> 00:38:09,970 Ik kon doen - 812 00:38:09,970 --> 00:38:12,520 hello, oke. 813 00:38:12,520 --> 00:38:14,470 Stand-by. 814 00:38:14,470 --> 00:38:17,360 Nieuwe computer hier, duidelijk - 815 00:38:17,360 --> 00:38:18,090 oke. 816 00:38:18,090 --> 00:38:21,730 >> Dus als ik deze nummers in de reeks - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 niet noodzakelijk op schaal. 819 00:38:30,530 --> 00:38:33,730 Oke, dus hier is mijn matrix - 820 00:38:33,730 --> 00:38:34,980 oh mijn god. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Oke, dus hier is mijn array. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh mijn god. 825 00:38:45,050 --> 00:38:48,820 >> [Lachen] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Pretend. 827 00:38:49,440 --> 00:38:52,330 Het is te veel moeite om terug te gaan en vast te stellen dat, dus er - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Dus we hebben deze array van 9, 17, 22, 26 en 34. 830 00:38:57,650 --> 00:39:00,260 Voor degenen onder u ziet de pijnlijke fout die ik maakte, 831 00:39:00,260 --> 00:39:00,830 daar is het. 832 00:39:00,830 --> 00:39:04,490 >> Dus ik beweren dat dit een zeer efficiënte oplossing. 833 00:39:04,490 --> 00:39:07,310 Ik heb toegewezen zoveel ints als Ik heb - een, twee, drie, 834 00:39:07,310 --> 00:39:09,100 vier, vijf, of zes - 835 00:39:09,100 --> 00:39:11,660 en ik heb vervolgens opgeslagen de nummers binnen deze array. 836 00:39:11,660 --> 00:39:15,220 Maar stel, dan, ik wil invoegen een waarde als de nummer 8? 837 00:39:15,220 --> 00:39:16,100 Nou ja, waar gaat het naartoe? 838 00:39:16,100 --> 00:39:18,530 Stel dat ik wil invoegen een getal als 20. 839 00:39:18,530 --> 00:39:19,790 Nou ja, waar gaat het naartoe? 840 00:39:19,790 --> 00:39:23,160 Daar ergens in het midden, of het getal 35 te gaan 841 00:39:23,160 --> 00:39:24,010 ergens eind. 842 00:39:24,010 --> 00:39:25,320 Maar ik ben al uit de ruimte. 843 00:39:25,320 --> 00:39:29,120 >> En dus dit is een fundamentele uitdaging van arrays die niet de oplossing zijn. 844 00:39:29,120 --> 00:39:32,280 Ik beweerde een moment geleden, getString lost dit probleem op. 845 00:39:32,280 --> 00:39:37,380 Als u wilt een zesde cijfer wilt invoegen in deze array, wat tenminste een 846 00:39:37,380 --> 00:39:40,090 oplossing die u kunt terugvallen op zeker, net zoals we doen met GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Wat is dat? 849 00:39:46,030 --> 00:39:48,190 >> Nou, maak het groter wordt makkelijker gezegd dan gedaan. 850 00:39:48,190 --> 00:39:52,810 We kunnen niet per se de array groter, maar wat kunnen we doen? 851 00:39:52,810 --> 00:39:56,570 Maak een nieuwe array die is groter, de grootte 6, of misschien maat 10, als we willen 852 00:39:56,570 --> 00:40:00,490 om de zaken vooruit te krijgen, en kopieer de oude array naar de nieuwe, en dan 853 00:40:00,490 --> 00:40:01,680 bevrijden van de oude array. 854 00:40:01,680 --> 00:40:05,770 >> Maar wat is de looptijd nu van dat proces? 855 00:40:05,770 --> 00:40:09,870 Het is groot O van n, omdat het kopiëren gaat kosten u een aantal eenheden van 856 00:40:09,870 --> 00:40:13,480 tijd, dus niet zo ideaal als we moeten toewijzen van een nieuwe serie, die gaat 857 00:40:13,480 --> 00:40:15,610 twee keer zoveel consumeren geheugen tijdelijk. 858 00:40:15,610 --> 00:40:16,660 Kopieer oud naar nieuw - 859 00:40:16,660 --> 00:40:18,800 Ik bedoel, het is gewoon een hoofdpijn, die is, nogmaals, waarom wij schreven 860 00:40:18,800 --> 00:40:19,920 GetString voor u. 861 00:40:19,920 --> 00:40:21,380 >> Dus wat kunnen we in plaats daarvan doen? 862 00:40:21,380 --> 00:40:25,000 Nou, wat als onze datastructuur heeft eigenlijk lacunes in het? 863 00:40:25,000 --> 00:40:30,790 Stel dat ik ontspannen mijn doel van het hebben van aaneengesloten delen van het geheugen, waarbij 9 864 00:40:30,790 --> 00:40:34,500 ligt pal naast 17, dat is naast 22, enzovoort. 865 00:40:34,500 --> 00:40:39,570 >> En stel dat 9 hier in kan zijn RAM, en 17 kan hier worden oververtegenwoordigd in RAM, 866 00:40:39,570 --> 00:40:40,990 en 22 kunnen hier worden oververtegenwoordigd in het RAM. 867 00:40:40,990 --> 00:40:43,610 Met andere woorden, ik heb ze niet nodig zelfs terug meer naar terug. 868 00:40:43,610 --> 00:40:47,850 Ik moet gewoon een of andere manier draad een naald door elk van deze nummers of elke 869 00:40:47,850 --> 00:40:51,010 van deze knooppunten, zoals we zullen noemen de rechthoeken zoals ik ze heb getekend, om 870 00:40:51,010 --> 00:40:55,670 herinner me hoe je naar de laatste dergelijke knooppunt van de eerste. 871 00:40:55,670 --> 00:40:59,940 >> Dus wat is het programmeren bouwen we hebben vrij recent gezien waarmee ik 872 00:40:59,940 --> 00:41:03,030 kan die draad te voeren, of hier getekend, waarmee ik kan 873 00:41:03,030 --> 00:41:05,430 implementeren die pijlen? 874 00:41:05,430 --> 00:41:06,500 Dus pointers, toch? 875 00:41:06,500 --> 00:41:09,560 Als ik wijzen niet alleen een int, maar een knoop - en 876 00:41:09,560 --> 00:41:10,810 knoop, ik bedoel gewoon container. 877 00:41:10,810 --> 00:41:12,900 En visueel, bedoel ik een rechthoek. 878 00:41:12,900 --> 00:41:16,420 Dus een knooppunt blijkbaar nodig heeft om twee waarden bevatten - 879 00:41:16,420 --> 00:41:21,490 het int zelf, en dan, zoals gesuggereerd door de onderste helft van de rechthoek, 880 00:41:21,490 --> 00:41:23,010 genoeg ruimte voor een int. 881 00:41:23,010 --> 00:41:26,130 >> Dus gewoon vooruitdenken hier, hoe groot is dit knooppunt, dit 882 00:41:26,130 --> 00:41:27,170 container in kwestie? 883 00:41:27,170 --> 00:41:29,250 Hoeveel bytes voor de int? 884 00:41:29,250 --> 00:41:31,310 Vermoedelijk 4, als het hetzelfde als normaal. 885 00:41:31,310 --> 00:41:33,270 En dan hoeveel bytes voor de pointer? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Dus deze container, of dit knooppunt, is naar een 8-byte structuur. 888 00:41:37,940 --> 00:41:41,760 Oh, en dat is een gelukkig toeval dat we gewoon introduceerde dit begrip 889 00:41:41,760 --> 00:41:44,400 een structuur, of een C-structuur. 890 00:41:44,400 --> 00:41:48,890 >> Dus ik beweren dat ik een stap wilt nemen richting van deze meer geavanceerde 891 00:41:48,890 --> 00:41:52,560 uitvoering van een lijst van nummers, een gelinkte lijst van nummers, ik moet een doen 892 00:41:52,560 --> 00:41:56,920 weinig meer denken aan de voorkant en verklaren niet alleen een int, maar een structuur 893 00:41:56,920 --> 00:41:58,620 dat ik bel, conventioneel hier, knooppunt. 894 00:41:58,620 --> 00:42:01,630 We kunnen het noemen wat we willen, maar knooppunt gaat thematische zijn in veel 895 00:42:01,630 --> 00:42:03,560 van de dingen die we gaan kijken naar nu. 896 00:42:03,560 --> 00:42:06,480 >> Binnenkant van dat knooppunt is een int n. 897 00:42:06,480 --> 00:42:09,350 En dan deze syntaxis, een beetje raar op het eerste gezicht - 898 00:42:09,350 --> 00:42:12,960 struct knoop * next. 899 00:42:12,960 --> 00:42:16,900 Nou picturaal, wat is dat? 900 00:42:16,900 --> 00:42:21,000 Dat is de onderste helft van de rechthoek die we zagen 901 00:42:21,000 --> 00:42:22,730 slechts een moment geleden. 902 00:42:22,730 --> 00:42:27,600 >> Maar waarom zeg ik struct knoop * in tegenstelling tot enkel knooppunt *? 903 00:42:27,600 --> 00:42:31,370 Want als dat pointer wijst op een ander knooppunt, het is gewoon de 904 00:42:31,370 --> 00:42:32,760 adres van een node. 905 00:42:32,760 --> 00:42:35,630 Dat is in overeenstemming met wat we hebben gesproken over pointers tot nu toe. 906 00:42:35,630 --> 00:42:39,690 Maar waarom, als ik beweer deze structuur is genaamd knooppunt, moet ik zeggen struct 907 00:42:39,690 --> 00:42:42,660 knooppunt binnen hier? 908 00:42:42,660 --> 00:42:43,190 >> Precies. 909 00:42:43,190 --> 00:42:46,490 Het is een soort van een domme realiteit van C. De typedef, om zo te zeggen, heeft niet 910 00:42:46,490 --> 00:42:47,220 nog niet gebeurd. 911 00:42:47,220 --> 00:42:48,510 C is super letterlijke. 912 00:42:48,510 --> 00:42:51,050 Het leest de code boven aan beneden, van links naar rechts. 913 00:42:51,050 --> 00:42:54,930 En totdat hij raakt dat puntkomma aan het bottom line, wat denk je wel niet 914 00:42:54,930 --> 00:42:57,590 bestaan ​​als een data type? 915 00:42:57,590 --> 00:42:59,060 Node, citaat unquote knooppunt. 916 00:42:59,060 --> 00:43:03,050 >> Maar vanwege de uitgebreidere verklaring deed ik op de eerste lijn - 917 00:43:03,050 --> 00:43:05,340 typedef struct knoop - 918 00:43:05,340 --> 00:43:08,790 want dat kwam voor het eerst, voordat de accolades, dat is een soort als 919 00:43:08,790 --> 00:43:11,800 pre-opleiden Clang dat, je weet je wat, geef me een struct 920 00:43:11,800 --> 00:43:13,570 riep struct knoop. 921 00:43:13,570 --> 00:43:16,270 Eerlijk gezegd, ik hou niet van bellen dingen struct knoop, struct knooppunt alle 922 00:43:16,270 --> 00:43:17,090 heel mijn code. 923 00:43:17,090 --> 00:43:20,660 Maar ik zal slechts een keer gebruiken, net binnen, zodat ik kan effectief 924 00:43:20,660 --> 00:43:25,010 creëren een soort cirkelvormige referentie, niet een pointer mezelf per se, maar een 925 00:43:25,010 --> 00:43:29,400 pointer naar de andere van een identiek type. 926 00:43:29,400 --> 00:43:32,330 >> Dus het blijkt dat op een datastructuur als dit, is er een paar 927 00:43:32,330 --> 00:43:34,470 bewerkingen die kunnen worden voor ons van belang. 928 00:43:34,470 --> 00:43:37,460 We zouden willen invoegen in een lijst als deze. 929 00:43:37,460 --> 00:43:39,850 We zouden willen verwijderen uit een lijst als deze. 930 00:43:39,850 --> 00:43:43,490 We zouden willen de lijst voor een zoeken waarde, of meer algemeen, traverse. 931 00:43:43,490 --> 00:43:46,410 En traverse is gewoon een mooie manier om zeggend beginnen bij de linker en verplaatst u alle 932 00:43:46,410 --> 00:43:47,650 helemaal naar rechts. 933 00:43:47,650 --> 00:43:52,640 >> En merk, zelfs met deze iets meer geavanceerde datastructuur, laat 934 00:43:52,640 --> 00:43:56,510 ik stel voor dat we een aantal van kunnen lenen de ideeën van de afgelopen twee weken en 935 00:43:56,510 --> 00:43:58,410 uitvoeren van een functie genaamd zoeken als deze. 936 00:43:58,410 --> 00:44:01,360 Het gaat om waar te keren of vals, wat aangeeft, ja of 937 00:44:01,360 --> 00:44:03,390 nee, n in de lijst. 938 00:44:03,390 --> 00:44:05,960 Het tweede argument is een pointer aan de lijst zelf, dus een 939 00:44:05,960 --> 00:44:07,920 pointer naar een knooppunt. 940 00:44:07,920 --> 00:44:10,350 >> Alles wat ik ga doen is dan te verklaren een tijdelijke variabele. 941 00:44:10,350 --> 00:44:12,730 We noemen het ptr volgens afspraak, voor de aanwijzer. 942 00:44:12,730 --> 00:44:15,220 En ik wijs deze gelijk is aan de het begin van de lijst. 943 00:44:15,220 --> 00:44:16,680 >> En let nu op de while lus. 944 00:44:16,680 --> 00:44:20,640 Zolang pointer niet gelijk op null, ga ik om te controleren. 945 00:44:20,640 --> 00:44:24,520 Is aanwijzer n gelijk aan de n die in was geslaagd? 946 00:44:24,520 --> 00:44:26,410 En wacht een minuut - nieuw stuk van de syntax. 947 00:44:26,410 --> 00:44:29,324 Wat is pijl ineens? 948 00:44:29,324 --> 00:44:30,574 Yeah? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Precies. 951 00:44:34,810 --> 00:44:38,860 Dus terwijl een paar minuten geleden, gebruikten we de dot-notatie om iets te 952 00:44:38,860 --> 00:44:43,080 binnenkant van de structuur, als de variabele je hebt niet de struct 953 00:44:43,080 --> 00:44:47,420 zelf, maar een pointer naar een struct, gelukkig, een stuk van de syntaxis die 954 00:44:47,420 --> 00:44:48,620 maakt eindelijk intuïtief gevoel. 955 00:44:48,620 --> 00:44:52,360 De pijl geeft de aanwijzer volgen, zoals onze pijlen doorgaans betekenen 956 00:44:52,360 --> 00:44:56,570 pictorially, en gaan op dataveld binnen. 957 00:44:56,570 --> 00:44:59,700 Dus pijl is hetzelfde als stip, maar u het gebruiken als je een pointer. 958 00:44:59,700 --> 00:45:05,270 >> Dus gewoon om samen te vatten dan, als het veld n binnenkant van de struct genaamd aanwijzer 959 00:45:05,270 --> 00:45:07,760 gelijk gelijk n, return true. 960 00:45:07,760 --> 00:45:11,970 Anders, deze lijn hier - wijzer gelijk pijltje. 961 00:45:11,970 --> 00:45:17,540 Dus wat dit doet, mededeling, is als ik ben momenteel wijzend op de structuur 962 00:45:17,540 --> 00:45:21,430 met 9, en 9 is niet het aantal Ik ben op zoek naar - veronderstel ik zoek 963 00:45:21,430 --> 00:45:22,830 voor n gelijk aan 50 - 964 00:45:22,830 --> 00:45:25,930 Ik ga mijn tijdelijke pointer updaten om niet wijzen op dit knooppunt 965 00:45:25,930 --> 00:45:31,190 meer, maar wijzer pijl naast, die gaat me hier zetten. 966 00:45:31,190 --> 00:45:34,270 >> Nu, realiseerde ik is een wervelwind introductie. 967 00:45:34,270 --> 00:45:37,380 Op woensdag gaan we eigenlijk doen met een aantal mensen en met wat meer 968 00:45:37,380 --> 00:45:38,900 code in een langzamer tempo. 969 00:45:38,900 --> 00:45:42,990 Maar beseffen, zijn we nu het maken van onze gegevens structuren complexer, zodat onze 970 00:45:42,990 --> 00:45:45,780 algoritmen kunnen krijgen efficiënter, die zal worden vereist voor 971 00:45:45,780 --> 00:45:50,500 PSET zes, toen we laden, nogmaals, die 150.000 woorden, maar moeten doen 972 00:45:50,500 --> 00:45:55,650 efficiënt, en idealiter, maak een programma dat draait voor onze gebruikers niet in 973 00:45:55,650 --> 00:46:00,460 lineaire, niet in n kwadraat, maar constante tijd, in het ideaal. 974 00:46:00,460 --> 00:46:02,300 >> We zien je op woensdag. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: Bij de volgende CS50, David vergeet zijn basisscenario. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: En dat is hoe je stuur tekstberichten met C. Wat de - 977 00:46:12,770 --> 00:46:14,020 >> [DIVERSE TEKSTBERICHT AANMELDING SOUNDS] 978 00:46:14,020 --> 00:46:19,734