1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> Sprecher 1: Lassen Sie uns ein Programm schreiben, dass bekommt einen String aus der Benutzer ohne 3 00:00:02,920 --> 00:00:05,700 mit dem CS50 Bibliothek GetString funktionieren. 4 00:00:05,700 --> 00:00:08,720 Um dies zu tun, werden wir weitermachen und nutzen scanf ist die Funktion, dass die GetString 5 00:00:08,720 --> 00:00:10,950 Funktion tatsächlich nutzt unter der Haube. 6 00:00:10,950 --> 00:00:13,780 Aber ich werde dies absichtlich tun in einem Buggy Weg. 7 00:00:13,780 --> 00:00:17,230 Ich werde in einer Weise, dass ich denke, tun wäre richtig, aber es stellt sich heraus, dass 8 00:00:17,230 --> 00:00:19,380 meine Annahme ist zu gehen sein ganz, ganz falsch. 9 00:00:19,380 --> 00:00:20,800 Und in der Tat, ganz gefährlich. 10 00:00:20,800 --> 00:00:24,750 Weil Bugs wie die, die ich bin, machen kann durch Gegner ausgenutzt werden 11 00:00:24,750 --> 00:00:28,870 so dass Ihre Maschine oder Ihr Programm können über potentiell genommen werden. 12 00:00:28,870 --> 00:00:30,200 >> Beginnen wir wie folgt. 13 00:00:30,200 --> 00:00:33,540 Lassen Sie uns zunächst erklären unsere Schnur, ansonsten nun als char Sterne bekannt ist, 14 00:00:33,540 --> 00:00:34,750 und nennen es ist. 15 00:00:34,750 --> 00:00:39,400 Ermöglicht dem Benutzer, für einen String dann eine Aufforderung, wie bei "string bitte." Und 16 00:00:39,400 --> 00:00:44,250 Lassen Sie uns jetzt bekommen die Zeichenfolge der Benutzer scanf mit, Zitat unquote, "% s". In 17 00:00:44,250 --> 00:00:47,760 Mit anderen Worten, wir, die wir scanf informieren Sie erwarten in der Tat um einen String zu erhalten 18 00:00:47,760 --> 00:00:48,630 von dem Benutzer. 19 00:00:48,630 --> 00:00:50,810 >> Aber jetzt müssen wir sagen, scanf eine andere Sache - 20 00:00:50,810 --> 00:00:53,350 wo die Zeichenfolge setzen, dass der Benutzer sieht. 21 00:00:53,350 --> 00:00:57,840 Nun, ich werde ganz einfach starten s mit Komma, die Angabe, dass ich möchte 22 00:00:57,840 --> 00:00:59,320 scanf die Zeichenfolge dort setzen. 23 00:00:59,320 --> 00:01:04,818 Ich werde nächsten ausdrucken etwas wie printf "Dank für die% s 24 00:01:04,818 --> 00:01:10,670 Backslash n Komma. "Und wie immer, ich bin gehen, um in der Zeichenfolge, s passieren. 25 00:01:10,670 --> 00:01:14,920 Nun wollen wir sparen, kompilieren und laufen diese Programm, und sehen, ob wir uns nicht veranlassen können 26 00:01:14,920 --> 00:01:16,590 das Problem habe ich vorhergesagt. 27 00:01:16,590 --> 00:01:18,650 >> Machen scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String bitte. 30 00:01:21,830 --> 00:01:25,540 Wir werden das so etwas wie: "Hallo." "Danke für die Null." Hmm, das ist nicht 31 00:01:25,540 --> 00:01:26,750 was ich erwartet hatte. 32 00:01:26,750 --> 00:01:28,240 Also, was ist denn hier los? 33 00:01:28,240 --> 00:01:32,040 >> Nun stellt sich heraus, weil wir erklärt s als char Sterne, aber wir haben nicht 34 00:01:32,040 --> 00:01:36,120 s tatsächlich in der Adresse eines gespeicherten Ist Teil des Speichers, tat nicht scanf 35 00:01:36,120 --> 00:01:38,940 überall haben, um die Zeichenfolge setzen dass der Benutzer eingegeben in. 36 00:01:38,940 --> 00:01:42,510 In der Tat, wenn der Benutzer jetzt geben eine viel längere Zeichenfolge als "hallo" 37 00:01:42,510 --> 00:01:46,780 zum Beispiel mehrere Textzeilen oder mehrere Textabsätze, ist es recht 38 00:01:46,780 --> 00:01:50,280 möglich, dass wir vielleicht eine induzieren sog. Segmentation Fault. 39 00:01:50,280 --> 00:01:53,570 >> Da scanf ist nicht zu wissen, dass Ich habe nicht wirklich eine Adresse setzen 40 00:01:53,570 --> 00:01:54,610 innerhalb von s. 41 00:01:54,610 --> 00:01:58,000 Vielmehr es geht um einen gewissen Wert zu sehen in s, einige Muster von Bits, die kann 42 00:01:58,000 --> 00:02:00,910 ein Müll Wert sehr gut sein, es nur durch Zufall. 43 00:02:00,910 --> 00:02:04,600 Und scanf ist noch im Gange, um zu versuchen zu schreiben der Benutzer String an diese Adresse, 44 00:02:04,600 --> 00:02:08,789 auch wenn es ein Müll Wert, ist die könnte in der Tat einen Absturz verursachen. 45 00:02:08,789 --> 00:02:10,130 >> Also, wie sollen wir dieses Problem beheben? 46 00:02:10,130 --> 00:02:12,523