1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> LUIDSPREKER 1: Laten we een programma schrijven dat krijgt een string van de gebruiker zonder 3 00:00:02,920 --> 00:00:05,700 met behulp van de CS50 Bibliotheek functioneren GetString. 4 00:00:05,700 --> 00:00:08,720 Om dit te doen, zullen we doorgaan en gebruiken scanf, de functie die de GetString 5 00:00:08,720 --> 00:00:10,950 functie daadwerkelijk gebruikt onder de motorkap. 6 00:00:10,950 --> 00:00:13,780 Maar ik ga dit bewust doen in een buggy manier. 7 00:00:13,780 --> 00:00:17,230 Ik ga doen op een manier die ik denk zou goed zijn, maar het blijkt dat 8 00:00:17,230 --> 00:00:19,380 mijn veronderstelling gaat heel, heel gebrekkig. 9 00:00:19,380 --> 00:00:20,800 En inderdaad zeer gevaarlijk. 10 00:00:20,800 --> 00:00:24,750 Omdat insecten zoals degene die ik ben over te maken kunnen worden uitgebuit door tegenstanders 11 00:00:24,750 --> 00:00:28,870 zodanig dat uw machine of je programma kan mogelijk worden overgenomen. 12 00:00:28,870 --> 00:00:30,200 >> Laten we beginnen als volgt. 13 00:00:30,200 --> 00:00:33,540 Laten we eerst verklaren onze reeks, nu wel bekend als een char ster, 14 00:00:33,540 --> 00:00:34,750 en noem het is. 15 00:00:34,750 --> 00:00:39,400 Laat naast vraagt ​​de gebruiker om een ​​string, als met "string alstublieft." En 16 00:00:39,400 --> 00:00:44,250 laten we nu krijgen de letters van de gebruiker gebruik scanf, citaat unquote, "% s." In 17 00:00:44,250 --> 00:00:47,760 Met andere woorden, laten we informeren scanf dat we hoeft in feite verwacht een string te krijgen 18 00:00:47,760 --> 00:00:48,630 van de gebruiker. 19 00:00:48,630 --> 00:00:50,810 >> Maar nu moeten we scanf vertellen een ander ding - 20 00:00:50,810 --> 00:00:53,350 waar om de string te zetten dat de gebruiker biedt. 21 00:00:53,350 --> 00:00:57,840 Nou, ik ga gewoon beginnen met komma s, met vermelding dat ik zou willen 22 00:00:57,840 --> 00:00:59,320 scanf om de string daar te zetten. 23 00:00:59,320 --> 00:01:04,818 Ik ga naast gaan om uit te printen iets zoals printf "bedankt voor de% s 24 00:01:04,818 --> 00:01:10,670 backslash n komma. "En zoals altijd, ik ben gaat pas in de string, s. 25 00:01:10,670 --> 00:01:14,920 Laten we nu eens redden, compileren en uitvoeren van deze programma, en kijken of we niet kunnen induceren 26 00:01:14,920 --> 00:01:16,590 het probleem dat ik voorspelde. 27 00:01:16,590 --> 00:01:18,650 >> Maak scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String alstublieft. 30 00:01:21,830 --> 00:01:25,540 Laten we zorgen voor iets als, "hallo." "Bedankt voor de nul." Hmm, dat is niet 31 00:01:25,540 --> 00:01:26,750 wat ik verwachtte. 32 00:01:26,750 --> 00:01:28,240 Dus wat is hier aan de hand? 33 00:01:28,240 --> 00:01:32,040 >> Nou, het blijkt dat, omdat we verklaard s als een char ster maar wij niet 34 00:01:32,040 --> 00:01:36,120 eigenlijk in s het adres van een opgeslagen daadwerkelijke stuk van het geheugen, scanf niet 35 00:01:36,120 --> 00:01:38,940 overal hebben om de string te zetten dat de gebruiker intikt 36 00:01:38,940 --> 00:01:42,510 Sterker nog, als de gebruiker zijn om te nu te typen in een veel langere reeks dan "hallo" 37 00:01:42,510 --> 00:01:46,780 bijvoorbeeld meerdere regels tekst of meerdere alinea's tekst, het is heel 38 00:01:46,780 --> 00:01:50,280 mogelijk dat we zouden kunnen leiden tot een zogenaamde segmentation fault. 39 00:01:50,280 --> 00:01:53,570 >> Omdat scanf is niet van plan om te weten dat Ik heb niet echt zetten een adres 40 00:01:53,570 --> 00:01:54,610 binnenkant van s. 41 00:01:54,610 --> 00:01:58,000 Integendeel, het gaat om een ​​bepaalde waarde te zien in s, sommige patroon van bits die kunnen 42 00:01:58,000 --> 00:02:00,910 een vuilnisbak waarde zeer goed, er slechts bij toeval. 43 00:02:00,910 --> 00:02:04,600 En scanf nog gaan proberen om te schrijven de gebruiker string naar dat adres, 44 00:02:04,600 --> 00:02:08,789 zelfs als het een vuilnis waarde, die inderdaad een crash kon veroorzaken. 45 00:02:08,789 --> 00:02:10,130 >> Dus hoe gaan we dit oplossen? 46 00:02:10,130 --> 00:02:12,523