>> [MUSIC SPIEL]
>> ROB BODEN: In Ordnung.
Also, erste, was zuerst von Video von einem bekannten Gesicht.
>> [VIDEO PLAYBACK]
>> -In Ordnung.
Dies ist CS50, und dies der Beginn der dritten Woche.
Tut mir leid, ich konnte es nicht mit euch sein heute, aber lassen Sie mich vorstellen
CS50 eigenen Rob Boden.
>> [END VIDEO PLAYBACK]
>> [Applaus und Jubel]
>> ROB BODEN: Die Filmografie in dass Video ist fantastisch.
Gut.
Also erstens, es gibt eine andere Mittagessen.
Es ist morgen um 01.15 Uhr.
Es gibt kein Mittagessen an diesem Freitag.
Es ist mit Quoren.
Und Tommy ist noch nicht hier, aber einer der die Menschen dort ist der ehemalige Leiter CF,
Tommy McWilliam.
Also er ist ein lustiger Kerl.
Sie sollten kommen.
>> Gut.
So letzte Woche haben wir begonnen, auseinander zu brechen über das, was ein String wirklich ist.
Wir haben seit Beginn bekannt, dass es ist eine Folge von Zeichen.
Aber letzte Woche, in der Tatsache, vertieft wir dass das, was ist wirklich eine Folge von
Zeichen, gut, wir haben jetzt Arrays von Zeichen.
Und wir wissen, dass ein String ist, ist es ein Array Zeichen, am Ende,
haben wir diese spezielle Null-Byte, diese Backslash 0, dass das Ende der
der String.
>> Und so ein String ist ein Array von Zeichen, aber wir haben mehr als
nur ein Array von Zeichen, Wir können eine Anordnung von einem haben
Art der Sache, die wir wollen.
Also, wenn Sie aus der vergangenen Woche zu erinnern, die Alter-Programm, das David eingeführt
wirklich schnell.
Also erste, was wir tun werden, ist bitten Sie den Benutzer für eine ganze Zahl, die
Anzahl der Personen im Raum.
Sobald wir diese ganze Zahl ist, wir ein Array deklarieren.
Beachten Sie diese Klammer-Syntax.
Sie werden sich daran gewöhnen.
>> Also sind wir der Deklaration einer Array von ganzen Zahlen Alter genannt, und es gibt n
Zahlen in diesem Array.
Also das Muster hier dieses 4 int i gleich 0, i kleiner als n, i plus
plus, dass wird sich auch ein Muster sein dass Sie sehr gewöhnen.
Denn das ist ziemlich viel, wie du bist immer zu Array zu durchlaufen.
Also denken Sie daran, dass n die Länge unseres Arrays.
Und hier werden wir immer wieder gefragt für das Alter der Person, die ich in den Raum.
>> Danach gehen wir hinunter, und für was auch immer beliebigen Grund haben wir dann
ausdrucken, wie alt sie werden ein Jahr ab jetzt.
Und läuft das Programm, lassen Sie uns machen Alter dot Strich Alters.
Also Anzahl der Personen im Raum, sagen wir mal sind es drei.
Und sagen, die erste Person ist 13, nächste ist 26, und die letzten 30.
Also dann wird es über diese drei laufen Menschen, ausdrucken 14, 27 und 31.
>> Also denken Sie daran, dass, wenn wir erklären, ein Array der Größe n, die Indizes in die
Anordnung weist die Arraywerte und Indizes 0, 1, 2, den ganzen Weg
bis zu n minus 1.
Also, wenn wir sagten, es waren drei Menschen in den Raum, und wir setzen hier
die erste Iteration durch diese Schleife wird i gehen zu 0 sein.
So in Index 0.
Wir sind die erste Zuweisung Alter der Benutzer eingibt.
Dann in den nächsten ein, betreten wir die zweite n der Benutzer eingibt, und in
neben zwei, die letzte n.
>> So fest, dass ein Array der Größe drei nicht alles haben
in dem Index drei.
Dies ist nicht gültig.
Gut.
So, hier geht zurück.
So, jetzt haben wir mit Arrays beschäftigt haben, wir haben eine gewisse Vertrautheit.
Jetzt werden wir auf dem Weg zu Befehl Zeilenargumente, die sein wird werden
ziemlich relevant zu dieser Problem-Set.
>> Also bis jetzt, wann immer Sie haben Ihre Hauptfunktion erklärt, haben wir
die int main nichtig.
So nichtig bedeutet nur, dass wir nicht vorbei jede
Argumente für diese Funktion.
Jetzt werden wir sehen, dass die Haupt kann einige Argumente zu nehmen.
Hier nennen wir sie int argc und String argv Klammern.
Die Klammern erneut anzeigt dass wir den Umgang mit Arrays.
Also hier, string argv Klammern, wir sind Umgang mit einem Array von Strings.
So argc, das wird sich zeigen, wie viele Argumente, die wir haben
zu diesem Programm geführt.
Und um zu sehen, was das bedeutet, Lassen Sie uns diese zu schließen.
>> OK.
Also bis jetzt haben wir jeden laufen Programm wie dot Strich Alters.
Wir können auch in der Befehlszeile, vorbei Argumente übergeben, damit der Begriff, Befehl
Zeilenargumente.
Also das erste Argument, hallo Welt.
Also hier wäre argc drei sein.
Es ist die Anzahl der Argumente auf der Kommandozeile.
Argc immer mindestens 1, da Punkt Schrägstrich Altersstufen, selbst, gilt als einer der
die Befehlszeilenargumente.
>> Dann ist die erste hallo.
Wenn die Dot-Schrägstrich Altersgruppen ist das nullte, dann hallo ist das erste und weltweit ist die
zweiten Befehlszeilenargument.
Also der String argv, wir werden sehen, enthält die Saiten, Punkt Schrägstrich
Alter, hallo, und der Welt.
Und durch David Anfrage, wir gehen , um ein Video, dass die Einführung zu spielen.
>> [VIDEO PLAYBACK]
>> -Bis jetzt in Programme, die wir haben geschrieben, wir erklären
Haupt als int main nichtig.
Und die ganze Zeit, hat diese Lücke einfach ist die Angabe, dass die
Programm übernimmt keinerlei Befehlszeilenargumente.
In anderen Worten, wenn ein Benutzer ein Programm, kann er oder sie Befehl bereitzustellen
Zeilenargumente durch das Schreiben von zusätzlichen Wörter oder Sätze, nachdem die Programm
Namen bei der Eingabeaufforderung.
>> Nun, wenn Sie Ihr Programm wollen nehmen Befehlszeilenargumente ein oder
mehr solche Worte müssen wir ersetzen Erlöschen mit einem Paar von Argumenten.
Also lassen Sie uns das tun.
Fügen CS50.h.
Fügen Standard io.h.
Haupt Int.
Und nun, statt der Leere, ich werde geben Sie eine int argc genannt, und ein
String-Array argv genannt.
Jetzt argc und argv sind einfach Konventionen.
>> Wir konnten diese Argumente genannt haben die meisten, was wir wollen.
Aber was wichtig ist, ist, dass argc ist ein int, da per Definition, ist es
gehen, um das Argument Zahl enthalten, die Anzahl der Wörter im Gesamt dass die
Benutzer hat auf seine oder ihre Aufforderung eingegeben.
argv, mittlerweile, Argument-Vektor ist gehen, um tatsächlich ein Array zu speichern sein
alle Wörter, die der Benutzer an seinem Eingabeaufforderung eingegeben.
>> Lassen Sie uns gehen jetzt etwas tun mit einem oder mehreren von diesen
Befehlszeilenargumente.
Insbesondere wollen wir weiter gehen und drucken was auch immer Wort der Benutzer
nach den Namen des Programms an der Eingabeaufforderung.
Offene Halterung.
Klammer zu.
Printf Prozent s Backslash und Komma.
Und jetzt muss ich sagen, welchen Wert printf in diese Platzhalter-Stecker.
Ich möchte das erste Wort, dass der Benutzer nach den Namen des Programms eingegeben,
und so werde ich angeben argv Winkel 1, in der Nähe
Klammern, Semikolon.
>> Nun, warum Winkel 1 und nicht die Halterung 0?
Nun stellt sich heraus, automatisch gespeichert in argv 0 sein wird, die
tatsächlichen Namen Programms.
Also das erste Wort, das der Benutzer nach den Namen des Programms ist, durch
Konvention sein wird in argv 1 gespeichert.
Lassen Sie uns nun kompilieren und führen Sie dieses Programm.
>> Machen argv 0, Punkt Strich argv 0.
Und nun ein Wort wie hallo.
Sie Enter.
Und da haben wir es, hallo.
>> [END VIDEO PLAYBACK]
>> ROB BODEN: In Ordnung.
Schließen, dass.
So nehmen Sie einen Blick auf dieses Programm, das wir uns nur eingeführt, gut, nur
um zu zeigen, wenn wir argv 0 zu drucken, zu machen, jetzt was ist es, argv 0, Punkt Strich argv 0.
Also, wie erwartet, es ist Ausdruck der Name des Programms, da argv 0
immer sein wird die Name des Programms.
Aber lassen Sie uns etwas ein etwas interessanter.
>> So in der Problem-Set, werden Sie dieser Funktion atoi eingeführt.
Also, was tun wir für atoi?
Das wird ein konvertieren String in einen Integer.
Also, wenn ich übergeben Sie die Zeichenfolge ein, zwei, drei, zu atoi, werde das zu konvertieren, dass
der ganzen Zahl, eins zwei drei.
So werden wir, um die erste konvertieren Befehlszeilenargument auf eine ganze Zahl,
und dann einfach ausdrucken, dass die Ganzzahl.
>> Also im Grunde, Art der wir Neuimplementierung getint, nur die
Ganzzahl wird in der Befehls eingegeben Zeile statt im Programm
interaktiv.
Also, was argv 0, machen wir es hier, und schließen Sie, dass.
So läuft argv 0, und wir geben die integer, eins zwei drei vier eins zwei.
So werde es die ganze Zahl zu drucken, ein zwei drei vier eins zwei.
Es gibt einige Feinheiten zu atoi es wird keine Gedanken über alles
über einen gültigen numerischen Zeichen, aber das spielt keine Rolle.
>> Also, was glauben Sie, passiert wenn ich das tun?
Segmentation fault.
Also, warum ist das so?
Wenn Sie zurückblicken auf unser Programm, wir sind Umwandlung argv 1, das erste Argument
nach dem Programmnamen, auf eine ganze Zahl.
Aber es gibt kein Argument übergeben nach dem Programmnamen.
So, hier sehen wir, dass dies ein Buggy Programm, da, wenn wir versuchen, es laufen
ohne Argumente, es wird nur abstürzen.
>> Also ein weiteres gemeinsames Muster werden Sie sehen, ist so etwas wie, wenn argc weniger
als zwei, was anzeigt, dass es nicht zumindest der Name des Programms und
erste Argument, dann werden wir etwas tun wie printf, nicht genug
Befehlszeilenargumente.
Das ist wahrscheinlich nicht gut zu drucken, es ist wohl so etwas, wie
sollten Sie eine ganze Zahl eingeben auf der Kommandozeile.
Ich werde nur am Ende es dort.
Und dann wieder ein.
Also denken Sie daran, dass am Ende unserer Programm, wenn wir 0 zurück, diese Art der
zeigt Erfolg.
Und Haupt auch automatisch 0 zurück, wenn Sie nicht zu tun.
>> Also hier, wir Umstimmung ein, um anzuzeigen, , dass das nicht den Erfolg.
Und Sie können zurückkehren, was Sie wollen, gerade, 0 bedeutet Erfolg, und
alles andere zeigt Versagen.
Also lasst uns laufen diese Version der Dinge.
So, jetzt, wenn wir geben nicht eine Befehlszeile Argument, wird es richtig zu sagen
uns, nicht genug Befehlszeile.
Haben Sie nicht den Satz zu beenden.
Andernfalls, wenn wir tatsächlich geben sie ein, es kann das Programm ab.
Also das ist, wie Sie in arge verwenden würden Um die Anzahl der zu validieren
Befehlszeilenargumente, dass tatsächlich bestanden.
>> Lassen Sie uns also dieses Programm ein bisschen mehr kompliziert, und Blick auf die zweite
Iteration der Dinge.
So, jetzt sind wir nicht nur den Druck der ersten Befehlszeilenargument.
Hier werden wir von int i equals laufen 0, i weniger als argc, i plus
plus, und Druck argv Index i.
Damit dieses Muster wieder, das ist die gleiche Muster wie vorher, außer dass
der Aufruf der variablen n verwenden wir argc.
>> Also das ist über jeden Index laufen in der Matrix, und jedes Druck
Element in diesem Array.
Und so, wenn wir dieses Programm ausführen, gut, Ich habe nicht einen beliebigen Befehlszeile
Argumente, so dass es nur Drucke Name das Programm.
Gebe ich ein paar Dinge, wird es drucken ein, die jeweils in einer eigenen Zeile.
>> OK.
Werfen wir also einen Schritt weiter.
Und statt dem Drucken jedes Argument in einer eigenen Zeile, lassen Sie drucken jedes
Charakter der einzelnen Argumente in einer eigenen Zeile.
Also denken Sie daran, dass argv ist ein Array von Strings.
Also, was ist ein String, aber ein Array von Zeichen?
Das heißt also, dass argv ist wirklich eine Array aus einer Anordnung von Zeichen.
So nutzt, dass, ignorieren wir das jetzt.
Lassen Sie uns nur überlegen den String argv 0.
>> Wenn wir also jedes Zeichen bringen wollen argv 0 in einer eigenen Zeile, dann will ich
, um das Muster wir es gewohnt sind zu tun, ist i kleiner ist als die Länge des Arrays,
die hier ist von strlen, das ist nicht das, was ich tun möchte, string
s entspricht argv 0.
So dass weniger als die Länge der i Anordnung, die in diesem Fall ist ein Array
von Zeichen, i plus plus.
Und so, wie wir letzte Woche gesehen haben, ist es ideal wenn wir uns bewegen, dass außerhalb strlen
der Zustand wird, da das Hinzufügen n die strlen von s jedes Mal, wenn wir
durch die Schlaufe, und es ist nicht sich zu ändern.
Also werden wir es gleich n hier eingestellt.
>> OK.
So, jetzt sind wir Laufen jeder Index im Array.
Und so, wenn wir jedes drucken möchten Charakter in diesem Array, c Prozent ist
die Flagge wollen wir nutzen für Zeichen.
Und jetzt ist ein Träger i sein wird die String, Index-Zeichen i, also, wenn die
String waren hallo.
dann s 0 wird sich h, s Halterung E 1 wird, und so weiter.
>> So nun zu kombinieren, wollen wir diese beiden Dinge.
Wir wollen jedes Zeichen drucken jeder Befehlszeilenargument.
So werden wir zu haben, für eine Schleife verschachtelt.
Und üblicherweise der erste Zähler Ich bin es, der nächste wird sich j, n
wird die strlen von argv ich sein, ich kleiner ist als n, i plus plus.
Und nun anstelle von Druck argv i, so argv Halterung i mit Index geht -
das wird das i-te Befehlszeile sein Argument, argv i, j wird sich
sein, die j-te Charakter der i-te Argument.
Ich werde dies hier jetzt loswerden da wir es in dieser Schleife.
So entspricht der String s equals argv i, s und dann Klammer j.
>> Nun, wir brauchen nicht zu erklären diese Variable s.
Stattdessen werden wir einfach kombinieren diese zwei in das, was wir hatten, argv i, j.
>> Sprecher 1: [unverständlich].
>> ROB BODEN: Guter Ruf.
Das ist also gebrochen.
Wenn ich tatsächlich lief es, wir würden haben dies erkannt.
Also das Gegen Ich kümmere mich um in diesem speziellen für
Schleife ist j, der Iterator.
Also würden Sie in Probleme ausgeführt haben, wahrscheinlich eine unendliche Schleife, wenn man
war nicht festgelegt, dass.
Das ist, warum wir auch im Gespräch zum Debuggen von heute.
>> OK.
Also lassen Sie dieses Programm ausführen.
Und lassen Sie uns tatsächlich fügen Sie einen separaten printf hier, die gerade gedruckt werden
eine andere Linie, da dies bedeutet, wenn wir führen Sie das Programm, es werde ein leer sein
Linie zwischen den einzelnen Zeichen der jede Befehlszeilenargument.
Nun, wir werden sehen, was das bedeutet.
Oop.
Haben Sie einige Fehler.
Fehler implizit erklärt Bibliotheksfunktion strlen.
>> So gehen zurück in unser Programm, ich vergessen, hash gehören string.h.
So string.h sein wird, die Headerdatei, die erklärt,
die Funktion strlen.
OK, kompiliert es.
Nun, lassen Sie es laufen.
Also gerade die.
Es geht um unsere ausdrucken Programmnamen, hallo Welt.
Es wird jedes Ding drucken, jeweils Charakter haben, auf seine eigene Linie.
OK.
>> Lassen Sie uns also tatsächlich nehmen diese einen Schritt weiter.
Und statt mit string.h, lassen darüber nachdenken, wie wir würden unsere eigenen implementieren
strlen-Funktion.
Also werde ich sofort geben eine Funktion Unterschrift.
Lassen Sie uns also in my_strlen nennen, und es ist gehen, um einen String als Argument zu nehmen,
und wir erwarten, dass die Rückkehr Länge dieser Zeichenfolge.
Also, wo ist dieser Kerl?
Ja.
OK.
Also denken Sie daran aus der früheren Folie, war auch von der letzten Woche, dass ein
Array von Zeichen, nun ja, ein String ist, so sagen wir, das ist unser String s.
Also, wenn s ist der String, hallo, dann, H-E-L-L-O, in Erinnerung, das wird
sein, und dann dieses Backslash 0 Charakter.
>> So, wie wir die Länge s bekommen?
Nun, das ist der Trick für diese Suche spiel 0 Charakter, dieses null
Terminator.
Also der Algorithmus Bevorstehende so etwas wie wenige sein
Zeichen genug, dass -
lassen Sie uns diese Hand stellen einige Zähler, nennen wir diese int length.
So, ab hier, wir sind gehen über unsere String durchlaufen.
>> So ist der erste Charakter, es ist H, und es ist nicht wieder zu senken 0, so
die Länge 1 ist.
Durchlaufen, um das nächste Zeichen, E, und es ist nicht Backslash 0.
Die Länge ist 2.
L, 3.
L, 4.
O, 5.
Und schließlich erreichen wir Backslash 0, und so, dass Mittel, gut,
Diese Saite ist vorbei.
Lassen Sie uns also zurück 5.
>> Also eigentlich die Umsetzung, dass, erstens, meine Länge n gleich 0 ist, meiner rechten Hand.
Und wir werden durchlaufen -
>> Sprecher 1: [unverständlich]
>> ROB BODEN: Oh, schießen.
Guter Ruf.
Boom.
Also Länge n gleich 0 ist.
So, jetzt tut, während s Länge nicht gleich und dann Backslash 0.
Also denken Sie daran, diese Backslash 0 ist, ist es ein tatsächlichen Charakter, und es zeigt
das Ende der Zeichenfolge.
Genau wie auch Backslash n ist eine tatsächliche Charakter.
Backslash 0 wird, um anzuzeigen, das Ende unserer String.
Ich will nicht, dass es gestellt.
Und während s durch Länge ist nicht indiziert gleich dem Nullabschluss, dann
wir sind gerade dabei, Länge zu erhöhen.
Also dann, am Ende unseres Programms, Länge wird schließlich werde
5 ist in diesem Fall.
Und wir werden nur Länge zurück.
>> OK.
So, jetzt hier unten, ich nicht my_strlen tun.
Lassen Sie kompilieren Sie es, um sicherzustellen, alles reibungslos läuft.
War ich dabei in 2?
Oder war das ein?
Das sollte zu tun.
Gut.
Das ist also argv 2.
Funktioniert wie erwartet, obwohl war, dass die, die ich tat es?
Ja.
OK.
Diese Version der Dinge nicht haben printf neue Zeile nach, aber es
macht keinen Unterschied.
OK.
So arbeitete wie erwartet.
>> Jetzt können wir sogar noch einen Schritt kombinieren weiter, wo Ankündigung hier, nun,
zuerst, wir greifen die strlen von argv i, und dann sind wir Laufen
jedes Zeichen in diesem String.
Also anstatt das zu tun, was, wenn wir nur diese Logik des Wartens kombinieren
bis wir umgekehrten Schrägstrich rechts 0 in dieser for-Schleife?
So durchlaufen, während argv i, j tut Backslash nicht gleich null.
Lassen Sie uns also führen Sie es zuerst.
>> Gut.
So, hier ist diese Bedingung sagen -
Lassen Sie uns klar, dass.
So, jetzt lassen Sie diese unsere argv sein.
Also, wenn ich das Programm kurz vor lief, argv ist ein Array von Strings.
Und so, wenn ich es mit Punkt Strich argv 2, hallo Welt, dann die argv
selbst ist Länge 3, für argv Null, hallo, und der Welt.
>> Und innerhalb jeder dieser Indizes ist, selbst ein Array, wo dies sein werde
dot, wird dies Strich zu sein, weiß ich nicht, wenn das die richtige Richtung, ich
glaube nicht, dass es war.
A-R-V Bindestrich, brauchen mehr Platz.
Lassen Sie uns in diesem Array abgeschnitten.
A-R-V Armaturenbrett 0, 0 und dann Backslash.
Und dann in Unordnung sein hallo.
Lassen Sie uns sagen, H-E 0 Backslash.
Und schließlich, W-O Backslash 0.
>> Also der Algorithmus, den wir gerade geschrieben haben, die verschachtelte for-Schleifen, was sie sind
tun ist, müssen wir zunächst die Zähler i und j dann.
Das wäre einfacher mit Code auf der Bildschirm, wir zurück zu diesem gehen.
OK.
So fest, dass i die Iterator, ist Iteration über jeden Befehl
Zeilenargument.
Und j die Iterator Iterieren über jedes Zeichen, dass
Befehlszeilenargument.
Also, was tut innersten printf ist, haben wir argv 0 0, printf printf
argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, aber jetzt, argv 0 7 wird zu
Backslash gleich null.
>> So beenden wir die for-Schleife und jetzt läuft i auf 1.
Und jetzt sind wir die Druck gehen argv 1 0, argv 1 1 -
Nun, jetzt, da ich kurz geschnitten hallo, argv 1 2 wieder sein wird
0 Backslash.
Und so, erhöhe i und weiter, und so weiter, bis wir alle drucken
Welt, und das sind drei Befehlszeile Argumente, und wir werden aus beenden
die äußerste Schleife, und Abschluss unseres Programms.
OK.
>> Lassen Sie uns also wieder hier.
So haben Sie eine gewisse Vertrautheit mit gewinnen Befehlszeilenargumente auf diese
besonderes Problem eingestellt.
>> Jetzt, Debugging.
So haben Sie wahrscheinlich schon zu tun hatte, einige Debugging mit Ihrer bisherigen
Problem eingestellt.
Und eine sehr einfache Möglichkeit, Debugging, Zuerst schauen wir uns an einem Buggy-Programm.
Nun, zu Fuß durch dieses Programm wir gehen, um den Benutzer für eine frage
ganze Zahl ist, greifen diese ganze Zahl ist, und dann, beliebig, haben wir eine while-Schleife,
ist gerade dabei zu verringern i bis es gleich 10 ist.
Sagen wir einfach davon ausgehen, ich bin der Eingabe eine ganze Zahl größer als 10 ist.
I so dekrementieren, bis sie gleich 10 ist.
>> Und dann haben wir eine weitere while-Schleife dass, während ich nicht gleich 0 ist, sind wir
werde ich um 3 zu verringern.
Also, wenn Sie die Absicht der Fehler sehen hier ist es, dass diese werde ich zu verringern
10 sein, und dann wird diese while-Schleife Willen Dekrement i von 10, 7, 4, 1,
negativer 2, negative 5, und so weiter, negative Unendlichkeit, da ich
eigentlich nie gleich null.
Und dann am Ende des Programms, wir haben die Funktion, die foo ist
los Ausdruck, dass i.
>> Also das ist eine kurze und triviale Programm, und der Fehler ist offensichtlich,
besonders nachdem ich gerade sagte, was der Fehler war.
Aber die Absicht ist hier, nun, dies könnte tatsächlich, wie einige schauen Sie
Lösungen von gierig aus der letzten Problem eingestellt, und vielleicht haben Sie
einige Endlosschleife im Programm, und Sie haben keine Ahnung
was es verursacht.
Also ein sehr nützliches Debugging-Technik ist, nur printfs hinzufügen
ganzen Code.
>> So, hier möchte ich eine printf außerhalb erste while-Schleife.
Und hier möchte ich ein printf, und ich werde einfach ausdrucken i.
Ich werde sogar zuerst tun while-Schleife, i.
Draußen zweite while-Schleife.
Wieder einmal innerhalb drucken hier der Wert i.
Und lassen Sie uns diese laufen.
>> So dot Strich debuggen.
Geben Sie eine ganze Zahl ist.
Lassen Sie uns 13.
Und Boom.
Wir sehen, dass wir Endlosschleife Innenseite der zweiten while-Schleife.
So, jetzt wissen wir, was der Fehler ist.
Aber printf-Debugging ist durchaus groß, aber wenn Sie Ihre Programme bekommen
mehr und mehr kompliziert, es anspruchsvollere Lösungen
Getting Things tätig.
So entfernen wir alle diese printfs.
Und lassen Sie uns sicherstellen, dass ich nicht brechen nichts.
OK.
>> Also das Programm werden wir einzuführen heißt
GDB, für GNU Debugger.
Na ja, eigentlich, entfernen wir für Debug- eine zweite, und stellen Debug wieder.
Na ja, eigentlich zunächst eine gute Lektion im Kommandozeilen-Argumente.
Beachten Sie, dass diese Schall-Befehl, der ist Kompilieren alles übergeben wird
auf der Kommandozeile, diese Befehlszeilenargumente.
So genau, wie Sie sich zu verwenden Kommandozeilen-Argumente, wie wir
haben, bevor und wie Sie werden in PSET 2, das ist, wie Schall wird mit ihnen.
>> So bemerken, dass diese erste Flagge, Bindestrich ggdb3, was das ist zu sagen, Schall,
Sie sollten diese Datei mit dem kompilieren Absicht, dass wir irgendwann
brauchen, um es zu debuggen.
So lange, wie Sie diese Fahne zu haben, dann können wir GDB debuggen.
Und es wird sich öffnen Sie die GNU Debugger.
>> So gibt es eine Menge von Befehlen, dass Sie zu gewöhnen.
Zuerst ein, dass Sie wahrscheinlich sofort brauchen, ist Run.
Also, was ist Führen Sie jetzt tun?
Es geht um unser Programm zu starten.
So laufen, Startprogramm, das Programm fragt uns, für eine ganze Zahl, 13.
Und dann ist es als Endlosschleife erwartet, außer ich entfernt die
printfs, so dass wir gar nicht sehen, dass.
Normalerweise verlassen.
Oh.
Es ist möglich, dass es eingewickelt alle Weise um, zurück zu - zu ignorieren, dass.
Angenommen, es hat in der Regel nicht verlassen.
Es ist eine komplizierte Antwort.
>> So, jetzt, das ist nicht sehr nützlich.
So einfach läuft unser Programm innerhalb von Diese Debugger hilft uns nicht in einem
Weise, da wir gerade getan haben könnte Slash Dot Debug von außen GDB.
Also das ein Befehl, Sie wahrscheinlich -
und ich werde das beenden.
Strg-d oder zu beenden, beide arbeiten.
Lassen Sie uns also öffnen Sie sie wieder auf.
>> Ein weiterer Befehl, dass Sie wahrscheinlich sofort wollen
gewöhnen ist Pause.
Also werden wir auf der Haupt für jetzt zu brechen, und dann werde ich erklären.
Nun, hier sehen wir, dass wir einen Haltepunkt an dieser Linie in debug.c.
Also, welche Mittel Pause ist, dass, wenn ich Geben Lauf wird das Programm gehen, um
weiter ausgeführt, bis Ich schlug einen Haltepunkt.
Also, wenn ich getroffen Lauf, startet das Programm, und dann bricht es, sobald es
tritt in die Hauptfunktion.
Brechen Haupt wird etwas sein Sie ziemlich häufig zu tun.
>> Und nun, Sie einzuführen einige weitere Befehle.
Beachten Sie hier, dass es zu sagen, wir brach in Zeile 11, die ist
printf, geben Sie eine ganze Zahl ist.
Also der nächste Befehl wird sein, wie wir gehen in die nächste Zeile Code.
Das wird es uns ermöglichen, Schritt durch unser Programm Zeile für Zeile.
Also das nächste.
>> Jetzt Linie 12, wir gehen die ganze Zahl zu erhalten.
Weiter.
Und wenn Sie einfach auf wieder betreten, werden sie wiederholen das letzte, was Sie getan haben.
So brauche ich nicht zu geben neben jeder Zeit.
So geben Sie eine ganze Zahl, 13.
So, jetzt, Zeile 14, während i größer ist als 10 ist, und ich werde nächstes zu tun.
Und wir sehen, wir werden i zu verringern.
So werden wir bis i wieder zu verringern.
>> So, jetzt ein weiteres nützliches Befehl Drucken.
So drucken wird zum Ausdrucken der Wert der Variablen.
Lassen Sie uns zu bringen, den Wert von Variable i.
Lassen Sie drucken i.
Es wird sagen, dass ich 11 ist.
Jetzt werden wir Sie erneut auf Weiter, während i größer als 10 ist.
Also habe ich immer noch größer als 10, denn es ist 11.
i minus minus.
Lassen Sie uns erneut zu drucken i.
Wie erwartet, ist es 10.
>> So, jetzt, neben.
Es ist wieder an die Bedingung gehen, i größer als 10, aber ich ist jetzt 10, so
es ist nicht größer als 10, so erwarten wir es, aus der while-Schleife fallen.
Und jetzt sind wir unter dieser Zeile Code.
Und ein anderer Befehl, Liste, ist gerade dabei die vorherige und nächste angezeigt
Paar von Codezeilen, in Falls Sie sich selbst verloren.
Also haben wir nur verlassen diese while-Schleife und jetzt haben wir diese eingegeben haben
while-Schleife, Zeile 18.
So, während ich nicht gleich 0 ist.
Und, neben, gleich i i minus 3, und wir werden bemerken, werden diese einfach weiter.
Und wir können i drucken.
>> Jeder Befehl Art hat Verknüpfungen.
Also p steht für Print.
So können wir p i.
Just keep holding n, oder weiterhin tun, Weiter.
Drucken i wieder.
Sie sehen, jetzt ist es negativ 167.
So wird dies ewig so weitergehen, aber nicht wirklich für immer, da Sie gerade gesehen haben, ist es
tatsächlich zu einem bestimmten Zeitpunkt zu beenden.
>> Damit wird Anfang GDB.
Aber lassen Sie uns noch etwas in GDB.
Äh, debuggen.
So, in diesem besonderen Fall die Endlosschleife passiert Innenseite sein
die Hauptfunktion.
Und jetzt, einfach akzeptieren, dass, was ich bin gehen, um die Endlosschleife in Bewegung
die Funktion foo.
Denken Sie daran, dass am Ende dieses Programm, gut, das war ursprünglich
Aufruf foo, das war einfach werde ich drucken.
Aber jetzt sind wir rufen foo, das ist, werde ich verringern, bis es 0 ist, und
drucken Sie dann die Variable.
OK.
Sparen, dass.
Machen Sie debuggen.
Und nun, gdb debuggen.
OK.
>> Also, wenn ich nur laufen dann werde ich nicht zu in der Lage, tatsächlich durch meinen Schritt
Programm Zeile-für-Zeile.
Lassen Sie uns also an den Haupt zu brechen, und geben Sie dann laufen.
Also durch diese gehen, printf, geben Sie eine ganze Zahl, erhalten die Ganzzahl, 13.
So werden wir Dekrementieren halten bis i grßer als 10 ist.
Dann werden wir durch die zu fallen while-Schleife, und sich auf die Linie -
öffnen wir es in einem separaten Fenster.
So verringert man, bis ich nicht mehr war größer als 10 ist, und dann wir
rief die Funktion foo.
>> Also, was passiert, sobald ich getroffen Funktion foo, gut, ich rief foo, und
dann hatte ich nicht mehr die Kontrolle über GDB.
Also, sobald ich auf Weiter auf dieser Linie, Dinge fortgesetzt, bis das passiert,
wo das Programm verlassen, wenn -
annehmen, dass es nicht irgendwann existieren.
Sie sah es für ein bisschen Pause aber.
Also warum habe ich verlieren die Kontrolle über das Programm an diesem Punkt?
Nun, als ich als nächstes schreiben, geht auf das die wörtliche nächste Codezeile, die
ausgeführt wird.
So nach Linie 21, die nächste Codezeile dass ausgeführt wird ist die Linie 22,
Das ist, Austritt aus main.
Also ich möchte nicht einfach gehen auf die nächste Zeile des Codes.
Ich will in der Funktion foo gehen, und dann auch durch Schritt
diese Codezeilen.
>> Also für das, haben wir eine Alternative.
Lassen Sie uns aufhören, dass wieder ein.
Brechen Haupt.
Uh, 1, Weiter, Weiter, 13, nächste, Weiter, Weiter, sorgfältig,
bevor wir Linie foo.
OK.
>> So, jetzt sind wir in Zeile 21, wo wir rufen foo.
Wir wollen nicht zum nächsten geben, denn das rufen Sie einfach die Funktion foo, und
gehen in die nächste Zeile Code.
Was wir verwenden möchten, ist Schritt.
Es gibt also einen Unterschied zwischen Schritt und nächstes Schritt, wo Sie die Schritte in der
funktionieren, und nächstes geht über die Funktion.
Er führt nur die Gesamtheit der die Funktion und läuft weiter.
>> Also Schritt wird uns bringen in der Funktion foo.
Und wir sehen hier, jetzt sind wir wieder bei Diese while-Schleife, ist in der Theorie,
ewig fortsetzen.
Und wenn Sie zu schlagen Schritt, wenn es nicht sogar eine Funktion zu nennen, dann ist es
identisch mit Weiter.
So ist es nur, wenn Sie an einer Linie sind, die ist eine Funktion, die Schritt Aufruf
wird sich von Next abweichen.
Also Schritt wird uns hierher zu bringen.
Schritt, Schritt, Schritt, Schritt, Schritt, Schritt, und Wir werden einfach Endlosschleife immer.
>> So könnten Sie, dass Ihre gewöhnen Verfahren zur Identifizierung Endlosschleifen ist
nur das Halten dieser Taste Enter, um sehen, wo Sie nicht weiterkommen.
Es gibt bessere Möglichkeiten, das zu tun, aber jetzt ist das vollkommen ausreichend.
Und stilistisch an Art-konform 50, sollte ich das getan haben.
OK.
>> So einen letzten Befehl, um einzuführen.
Nun, lassen Sie gdb debuggen in.
Also anstatt an Haupt brechen, wenn ich kennen die Funktion foo ist auch die
Problem, dann habe ich konnte einfach sagte, brechen bei foo statt.
Sagen wir, ich brechen an Haupt-und foo.
So können Sie so viele Haltepunkte setzen wie Sie wollen.
Wenn ich schreibe Lauf, es geht an der Haltestelle -
ooh, lassen Sie neu kompilieren, da Ich änderten sich die Dinge.
Sie finden diese Linie, Warnung, Quelle zu sehen Datei neuer ist als ausführbare Datei.
Das heißt also, dass ich gerade hier ging und verändert diese, um Stil entsprechen
50, aber ich habe nicht neu kompilieren das Programm.
So GDB macht mich bewusst.
Ich werde aufhören, machen Debug wieder getroffen gdb debuggen.
OK.
>> So, jetzt zurück zu dem, was ich tat.
Brechen Haupt-, Pause foo.
Nun, wenn ich das Programm laufen, so ist es geht weiter, bis ein Treffer
Breakpoint.
Das Haltepunkt passiert sei der erste am wichtigsten.
Nun, anstatt das zu tun nächste, nächste, nächste, Weiter, Weiter, bis ich foo, ich
können weiterhin geben, die weiterhin , bis Sie auf den nächsten Haltepunkt.
Ich muss die ganze Zahl zuerst ein.
Weiter wird auch weiterhin, bis ich die nächsten Haltepunkt, was das ist
Funktion foo.
>> So Run laufen, bis Sie auf eine Haltepunkt, aber nur geben, wenn Lauf
Sie beginnen das Programm, und dann, von da an, ist es auch weiterhin.
Wenn ich gerade tat brechen Haupt-und dann lief, wird es bei brechen
Haupt-, und dann weiter.
Da ich nicht über einen Haltepunkt an foo, geben Sie die ganze Zahl ist, dann bin ich jetzt
nicht auf foo zu brechen.
Es ist nur los auf unendlich Schleife, bis dass.
OK.
>> Also das ist, Intro to GDB.
Sie sollten beginnen, es zu benutzen Ihr Problem in Sets.
Es kann sehr hilfreich sein , um Fehler zu identifizieren.
Wenn Sie tatsächlich nur, Zeile für Zeile, gehen durch den Code, und vergleichen, was
tatsächlich geschieht mit dem, was Sie erwarten passieren, dann ist es ziemlich
schwierig, Ihre Fehler zu verpassen.
OK.
>> So letzte Woche David brachte diese Secret-Key-Kryptographie Zeug für die
erste Mal, wo wir nicht wollen, Passwörter einfach auf unsere gespeichert werden
Computer in einigen Nur-Text-Datei, in der kann jemand einfach kommen und über
öffnen Sie es und lesen Sie sie.
Idealerweise würden sie verschlüsselt werden in irgendeiner Weise.
Und Problem Set 2, werden Sie sich mit einem Verfahren zur Verschlüsselung,
oder, na ja, zwei Methoden, aber sie sind nicht so groß.
Wenn Sie die Ausgabe Hacker tun, sind Sie auch gehen, um mit zu tun
Entschlüsseln einige Dinge.
>> Also die Frage ist jetzt, gut, auch wenn wir haben die stärkste Verschlüsselung
Algorithmus in der Welt, wenn Sie ein besonders schlechte vergessen, dann ist es
wird dir nicht helfen sehr viel, da die Menschen noch in der Lage, um es herauszufinden sein.
Auch wenn sehen die verschlüsselten String und es sieht aus wie ein Chaos von Müll
das bedeutet nichts, um sie, wenn sie müssen nur noch ein paar Passwörter ausprobieren
um es herauszufinden, dann sind nicht sehr sicher.
So ein Video ansehen, dass macht diesen Punkt.
>> [VIDEO PLAYBACK]
>> -Helm, Sie Unhold.
Was ist los?
Was tun Sie, um meine Tochter?
>> -Lassen Sie mich vorstellen die brillante junge plastischen Chirurgen, Dr. Phillip
Schlotkin, die größte Nase Job-Mann in der gesamten
Universum und Beverly Hills.
>> -Hoheit.
>> Nose-Job?
Ich verstehe nicht.
Sie ist schon eine Nase Job.
Es war eine süße sechzehn vorhanden.
>> -No.
Es ist nicht das, was Sie denken.
Es ist viel, viel schlimmer.
Wenn Sie mir nicht die Kombination die Luftschild, Dr. Schlotkin wird
geben Sie Ihre Tochter wieder ihre alte Nase.
>> -No.
Wo hast du das her?
>> -In Ordnung.
Ich werde erzählen.
Nein, Papa.
Nein, das darfst du nicht.
>> -Sie sind richtig, meine Liebe.
Ich werde Ihre neue Nase verpassen.
Aber ich werde ihm nicht sagen, die Kombination, egal was.
>> -Sehr gut.
Dr. Schlotkin, mach was du willst.
>> -Mein Vergnügen.
>> [TOOLS geschärft]
>> -No.
Warten.
Ich werde erzählen.
>> -Ich wusste, dass es funktionieren würde.
Gut.
Gib es mir.
>> -Die Kombination eines.
>> -One.
>> -Two.
>> -Drei.
>> -Four.
>> -Five.
>> -Also das ist eine Kombination, zwei, drei, vier, fünf.
Das ist die dümmste Kombination Die ich je in meinem Leben gehört.
Das ist die Art von Sache, ein Idiot würde auf seinem Gepäck haben.
>> -Danke, Eure Hoheit.
>> -Was haben Sie getan?
>> -Ich drehte mich von der Wand.
>> -Nein hast du nicht.
Sie schaltete den ganzen Film.
>> -Ich muss den falschen Knopf gedrückt haben.
>> Nun, legte es wieder auf.
Setzen Sie den Film wieder auf.
>> -Ja, Sir.
Ja, Sir.
>> -Gehen wir, Arnold.
Komm, Gretchen.
Natürlich wissen Sie, ich werde noch müssen Sie für diese in Rechnung stellen.
>> [END VIDEO PLAYBACK]
>> ROB BODEN: In Ordnung.
So, jetzt haben wir schon gesprochen Sicherheit in gewisser Weise schön
kleine Filmplakat, so dass in den letzten Tage, diese Fragen mit der NSA
Überwachung.
Es kann schwierig sein, wie Sie sich fühlen haben eine Art von Privatsphäre in der
Online-Welt, obwohl ich nicht sagen könnte Sie die meisten Details der PRISM.
Also sich jenseits PRISM, werden wir nicht , darüber zu reden, jetzt
denken Sie an Ihren Laptop.
Also hier oben, ich will wechseln zu meinem eigentlichen Konto,
mit meinem kleinen Pinguin.
So habe ich ein Passwort gesetzt, und das vergessen ist, was ich will es sein.
>> Aber denken Sie daran, dass das, was ich die Anmeldung mit, so dass diese Anmeldung
Aufforderung einige Programm.
Es gibt einige Programm, das war durch irgendeine Person geschrieben.
Und so, dass die Person, wenn sie besonders bösartige, konnten sie
gesagt haben, alles in Ordnung, so dass, wenn das Passwort geben, dass ich gleich mein
eigentliche Passwort, oder er ist gleich bis zu einem gewissen speziellen Passwort -
David ist genial oder so etwas -
dann lassen sie in.
So ein böswilliger Programmierer haben könnte Zugriff auf alle Ihre Macs oder
Windows oder nichts.
>> Das ist also nicht viel von einer Besorgnis, da, Ich meine, das ist Anmeldeprogramm
das ist mit OS X, hunderte ausgeliefert oder Tausende von Menschen haben
überprüft den Code.
Und so, wenn irgendwo im Code, die Sie sagen, wenn diese Zeichenfolge entspricht Gleichen
David ist genial, Login, dann jemand ist sein wird, wie, warten.
Das ist nicht richtig.
Dies sollte nicht hier sein.
Also das ist eine Art, wie wir die Dinge zu Art sicher sein.
>> Aber auch über Programme nachdenken dass Sie schreiben.
Nehmen wir an, Sie die Login-Programm geschrieben hat.
Also das Login-Programm, das Sie geschrieben haben, so offensichtlich, eine gut sind Sie
Programmierer.
Du wirst doch nicht jede böswillige zu setzen wenn x gleich gleich David ist genial
in den Code.
Aber dieses Programm, was Sie tun verwenden, um dieses Programm zu kompilieren?
So etwas wie Schall.
So was, wenn die Person, die passiert schreiben Clang Sonder in Clang verrohrten
so etwas wie, wenn ich die Zusammenstellung loggen Programm, dann geben Sie diesen Code
in das Login-Programm, das sagt, wenn x gleich gleich David ist genial?
Also noch nicht ganz, aber wir haben die gleiche Ausgabe hier, wo Clang, gut,
Tausende, wenn nicht Zehntausende Menschen haben bei Clang sah, haben
sah ihre Code-Zeilen und sagte: alles in Ordnung, es ist nichts schlecht hier.
Offensichtlich ist niemand tun alles, was diese bösartige.
>> Aber was wird sich Klang, wie, was, wenn ich kompilieren Clang?
Was ist, wenn ich etwas Compiler, Clang kompiliert, die in Clang Einsätze
diese spezielle Hack, der sagt, alles in Ordnung, wenn ich kompilieren Clang, dann die
ausführbare bekomme ich speziell schauen sollte Innenseite der Anmeldeprogramm und Einsatz
dieses Passwort, gleich equals Dave ist genial?
Also denken Sie daran, dass Ihr Compiler selbst muss zu einem bestimmten Zeitpunkt erstellt werden.
Also, wenn das, was Sie wählen, um Clang kompilieren mit, selbst bösartig, dann sind Sie
könnte die gesamte aufgeschraubt werden Weg auf der ganzen Linie.
>> So, hier haben wir Ken Thompson und Dennis Ritchie.
Also das ist eine ikonische Foto.
Dennis Ritchie ist auf der rechten Seite.
Er ist ein wichtiger -
ziemlich schrieb C. So kann man danke ihm für diese Klasse.
Ken Thomson ist auf der linken Seite.
Die zwei von ihnen im Grunde schrieb UNIX.
Nun, die Hauptursachen waren sie in UNIX.
Es gab einige andere.
So Ken Thompson, an einem gewissen Punkt, gewinnt er den Turing Award.
Und der Turing Award, habe ich immer gehört habe das so referenziert, ist es das
Nobelpreis der Informatik.
>> Also an der Turing Award, hat er geben seiner Dankesrede.
Und er gibt diesem sehr berühmten Rede Jetzt, Reflections on Trusting genannt
Trust, die wir verlinkt haben Um auf der Kurs-Website.
Und in dieser Rede, sagt er, alles in Ordnung, so schrieb ich UNIX, und jetzt alle
Sie sind Menschen mit UNIX.
Nun, denken Sie daran, dass Linux heute ein direkter Nachkomme von UNIX.
OS X direkt verwendet UNIX.
Windows-nicht so sehr, aber eine Menge Ideen wurden von UNIX übernommen.
>> So geht er auf die Bühne und sagt: gut, ich schrieb UNIX.
Und damit Sie wissen, Jungs, ich bin der Lage, in jeder Anmeldung
Einzel einer der Computer.
Da habe ich eine dieser speziellen, wenn x gleich gleich Ken Thomson ist genial,
dann darf ich dich einloggen.
So können die Leute sind wie, na ja, wie hast du das gemacht?
Wir sahen uns das Login-Programm und nichts ist da.
Er ist wie, nun ja, modifizierte ich die Compiler in der Login-Programm anmelden
so dass die Anmeldeprogramm jetzt haben dass x gleich gleich Ken Thompson
ist genial.
>> Und sie sagen, gut, das ist nicht wahr.
Wir sind an der Compiler suchen, und die Compiler keine Linien haben
Code so.
Er ist wie, OK, aber was sind Sie Zusammenstellung der Compiler mit?
Und sie denken, und er ist, wie, na ja, Ich bin derjenige, der Compiler gab
Sie verwenden, um den Compiler zu kompilieren, so Sie kompilieren einen Compiler, dass
selbst ist bösartig, und wird brechen die Login-Programm.
Also im Grunde, an diesem Punkt gibt es keine Möglichkeit, Sie könnten an der Quelle zu sehen
Code des Login-Programm um zu sehen, was falsch ist.
Sie konnte sich nicht einmal in der Suche Quellcode des Compilers
um zu sehen, was falsch ist.
>> Sie müssten, um an der Maschine zu suchen Code, der für die tatsächliche binäre
Compiler kompiliert, um zu sehen, warten Sie, diese Zeilen Code sollte nicht hier sein.
Aber Ken Thompson nahm es einen Schritt weiter und sagte, gut, es gibt
diese speziellen Programme, die tatsächlich Ihnen helfen, die binäre Programme zu lesen,
und so, wenn jemand das Programm verwendet, um lesen Sie die binäre, würden sie diese sehen
Codezeilen.
Er modifizierte diese Programme zu sagen, alle richtig, wenn Sie auf der Suche sind
Compiler, nicht diese besondere zeigen Satz binärer.
>> Also dann müssen Sie nehmen, dass ein Schritt weiter und im Grunde, dass haben könnte
genommen mehrere Dereferenzierungsebenen, und irgendwann, ist niemand wirklich
gehen zu überprüfen.
So ist die Moral von der Geschichte ist, sind Sie nicht zu sein Schreiben
Klang in dieser Klasse.
Du gehst zu sein mit Kletter Klang viel in dieser Klasse.
Für alles, was Sie wissen, ist eine bösartige Clang Programm, das sabotiert wird jedes
einzigen Programm, das Sie jemals zusammengestellt haben.
Und um Ihnen auf diesem sehr ominösen verlassen beachten Sie, sehen Sie, am Mittwoch.
>> [Applaus]
>> Sprecher 2: Bei der nächsten CS50.
>> SPEAKER 3: Wagen Sie es nicht sagen.
Sie können dies tun.
Sie habe das schon getan haben, können Sie dies tun heute, können Sie dies morgen tun.
Sie machen das schon seit Jahren.
Gehen Sie einfach da und tun.
Sie können dies tun.
>> [MUSIC SPIEL]