>> Sprecher 1: Lassen Sie uns ein Programm schreiben, dass bekommt einen String aus der Benutzer ohne
mit dem CS50 Bibliothek GetString funktionieren.
Um dies zu tun, werden wir weitermachen und nutzen scanf ist die Funktion, dass die GetString
Funktion tatsächlich nutzt unter der Haube.
Aber ich werde dies absichtlich tun in einem Buggy Weg.
Ich werde in einer Weise, dass ich denke, tun wäre richtig, aber es stellt sich heraus, dass
meine Annahme ist zu gehen sein ganz, ganz falsch.
Und in der Tat, ganz gefährlich.
Weil Bugs wie die, die ich bin, machen kann durch Gegner ausgenutzt werden
so dass Ihre Maschine oder Ihr Programm können über potentiell genommen werden.
>> Beginnen wir wie folgt.
Lassen Sie uns zunächst erklären unsere Schnur, ansonsten nun als char Sterne bekannt ist,
und nennen es ist.
Ermöglicht dem Benutzer, für einen String dann eine Aufforderung, wie bei "string bitte." Und
Lassen Sie uns jetzt bekommen die Zeichenfolge der Benutzer scanf mit, Zitat unquote, "% s". In
Mit anderen Worten, wir, die wir scanf informieren Sie erwarten in der Tat um einen String zu erhalten
von dem Benutzer.
>> Aber jetzt müssen wir sagen, scanf eine andere Sache -
wo die Zeichenfolge setzen, dass der Benutzer sieht.
Nun, ich werde ganz einfach starten s mit Komma, die Angabe, dass ich möchte
scanf die Zeichenfolge dort setzen.
Ich werde nächsten ausdrucken etwas wie printf "Dank für die% s
Backslash n Komma. "Und wie immer, ich bin gehen, um in der Zeichenfolge, s passieren.
Nun wollen wir sparen, kompilieren und laufen diese Programm, und sehen, ob wir uns nicht veranlassen können
das Problem habe ich vorhergesagt.
>> Machen scanf-1.
./scanf-1.
String bitte.
Wir werden das so etwas wie: "Hallo." "Danke für die Null." Hmm, das ist nicht
was ich erwartet hatte.
Also, was ist denn hier los?
>> Nun stellt sich heraus, weil wir erklärt s als char Sterne, aber wir haben nicht
s tatsächlich in der Adresse eines gespeicherten Ist Teil des Speichers, tat nicht scanf
überall haben, um die Zeichenfolge setzen dass der Benutzer eingegeben in.
In der Tat, wenn der Benutzer jetzt geben eine viel längere Zeichenfolge als "hallo"
zum Beispiel mehrere Textzeilen oder mehrere Textabsätze, ist es recht
möglich, dass wir vielleicht eine induzieren sog. Segmentation Fault.
>> Da scanf ist nicht zu wissen, dass Ich habe nicht wirklich eine Adresse setzen
innerhalb von s.
Vielmehr es geht um einen gewissen Wert zu sehen in s, einige Muster von Bits, die kann
ein Müll Wert sehr gut sein, es nur durch Zufall.
Und scanf ist noch im Gange, um zu versuchen zu schreiben der Benutzer String an diese Adresse,
auch wenn es ein Müll Wert, ist die könnte in der Tat einen Absturz verursachen.
>> Also, wie sollen wir dieses Problem beheben?