1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [MUSIC SPIEL] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: In Ordnung. 4 00:00:12,100 --> 00:00:15,620 Also, erste, was zuerst von Video von einem bekannten Gesicht. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [VIDEO PLAYBACK] 7 00:00:22,560 --> 00:00:23,370 >> -In Ordnung. 8 00:00:23,370 --> 00:00:27,150 Dies ist CS50, und dies der Beginn der dritten Woche. 9 00:00:27,150 --> 00:00:29,980 Tut mir leid, ich konnte es nicht mit euch sein heute, aber lassen Sie mich vorstellen 10 00:00:29,980 --> 00:00:32,880 CS50 eigenen Rob Boden. 11 00:00:32,880 --> 00:00:33,872 >> [END VIDEO PLAYBACK] 12 00:00:33,872 --> 00:00:39,340 >> [Applaus und Jubel] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: Die Filmografie in dass Video ist fantastisch. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Gut. 16 00:00:47,770 --> 00:00:50,960 Also erstens, es gibt eine andere Mittagessen. 17 00:00:50,960 --> 00:00:52,330 Es ist morgen um 01.15 Uhr. 18 00:00:52,330 --> 00:00:54,480 Es gibt kein Mittagessen an diesem Freitag. 19 00:00:54,480 --> 00:00:55,810 Es ist mit Quoren. 20 00:00:55,810 --> 00:01:00,190 Und Tommy ist noch nicht hier, aber einer der die Menschen dort ist der ehemalige Leiter CF, 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Also er ist ein lustiger Kerl. 23 00:01:02,730 --> 00:01:04,819 Sie sollten kommen. 24 00:01:04,819 --> 00:01:05,900 >> Gut. 25 00:01:05,900 --> 00:01:11,360 So letzte Woche haben wir begonnen, auseinander zu brechen über das, was ein String wirklich ist. 26 00:01:11,360 --> 00:01:14,830 Wir haben seit Beginn bekannt, dass es ist eine Folge von Zeichen. 27 00:01:14,830 --> 00:01:18,130 Aber letzte Woche, in der Tatsache, vertieft wir dass das, was ist wirklich eine Folge von 28 00:01:18,130 --> 00:01:22,110 Zeichen, gut, wir haben jetzt Arrays von Zeichen. 29 00:01:22,110 --> 00:01:26,450 Und wir wissen, dass ein String ist, ist es ein Array Zeichen, am Ende, 30 00:01:26,450 --> 00:01:30,920 haben wir diese spezielle Null-Byte, diese Backslash 0, dass das Ende der 31 00:01:30,920 --> 00:01:32,230 der String. 32 00:01:32,230 --> 00:01:36,970 >> Und so ein String ist ein Array von Zeichen, aber wir haben mehr als 33 00:01:36,970 --> 00:01:39,530 nur ein Array von Zeichen, Wir können eine Anordnung von einem haben 34 00:01:39,530 --> 00:01:40,890 Art der Sache, die wir wollen. 35 00:01:40,890 --> 00:01:51,570 Also, wenn Sie aus der vergangenen Woche zu erinnern, die Alter-Programm, das David eingeführt 36 00:01:51,570 --> 00:01:53,560 wirklich schnell. 37 00:01:53,560 --> 00:01:57,010 Also erste, was wir tun werden, ist bitten Sie den Benutzer für eine ganze Zahl, die 38 00:01:57,010 --> 00:01:58,800 Anzahl der Personen im Raum. 39 00:01:58,800 --> 00:02:01,260 Sobald wir diese ganze Zahl ist, wir ein Array deklarieren. 40 00:02:01,260 --> 00:02:02,890 Beachten Sie diese Klammer-Syntax. 41 00:02:02,890 --> 00:02:04,540 Sie werden sich daran gewöhnen. 42 00:02:04,540 --> 00:02:09,430 >> Also sind wir der Deklaration einer Array von ganzen Zahlen Alter genannt, und es gibt n 43 00:02:09,430 --> 00:02:12,080 Zahlen in diesem Array. 44 00:02:12,080 --> 00:02:16,480 Also das Muster hier dieses 4 int i gleich 0, i kleiner als n, i plus 45 00:02:16,480 --> 00:02:20,580 plus, dass wird sich auch ein Muster sein dass Sie sehr gewöhnen. 46 00:02:20,580 --> 00:02:24,000 Denn das ist ziemlich viel, wie du bist immer zu Array zu durchlaufen. 47 00:02:24,000 --> 00:02:26,330 Also denken Sie daran, dass n die Länge unseres Arrays. 48 00:02:26,330 --> 00:02:32,120 Und hier werden wir immer wieder gefragt für das Alter der Person, die ich in den Raum. 49 00:02:32,120 --> 00:02:36,640 >> Danach gehen wir hinunter, und für was auch immer beliebigen Grund haben wir dann 50 00:02:36,640 --> 00:02:40,220 ausdrucken, wie alt sie werden ein Jahr ab jetzt. 51 00:02:40,220 --> 00:02:49,980 Und läuft das Programm, lassen Sie uns machen Alter dot Strich Alters. 52 00:02:49,980 --> 00:02:53,010 Also Anzahl der Personen im Raum, sagen wir mal sind es drei. 53 00:02:53,010 --> 00:02:59,880 Und sagen, die erste Person ist 13, nächste ist 26, und die letzten 30. 54 00:02:59,880 --> 00:03:05,080 Also dann wird es über diese drei laufen Menschen, ausdrucken 14, 27 und 31. 55 00:03:05,080 --> 00:03:16,060 >> Also denken Sie daran, dass, wenn wir erklären, ein Array der Größe n, die Indizes in die 56 00:03:16,060 --> 00:03:19,950 Anordnung weist die Arraywerte und Indizes 0, 1, 2, den ganzen Weg 57 00:03:19,950 --> 00:03:21,680 bis zu n minus 1. 58 00:03:21,680 --> 00:03:26,255 Also, wenn wir sagten, es waren drei Menschen in den Raum, und wir setzen hier 59 00:03:26,255 --> 00:03:29,850 die erste Iteration durch diese Schleife wird i gehen zu 0 sein. 60 00:03:29,850 --> 00:03:31,650 So in Index 0. 61 00:03:31,650 --> 00:03:34,540 Wir sind die erste Zuweisung Alter der Benutzer eingibt. 62 00:03:34,540 --> 00:03:38,870 Dann in den nächsten ein, betreten wir die zweite n der Benutzer eingibt, und in 63 00:03:38,870 --> 00:03:40,580 neben zwei, die letzte n. 64 00:03:40,580 --> 00:03:44,200 >> So fest, dass ein Array der Größe drei nicht alles haben 65 00:03:44,200 --> 00:03:46,040 in dem Index drei. 66 00:03:46,040 --> 00:03:49,036 Dies ist nicht gültig. 67 00:03:49,036 --> 00:03:50,250 Gut. 68 00:03:50,250 --> 00:03:55,136 So, hier geht zurück. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 So, jetzt haben wir mit Arrays beschäftigt haben, wir haben eine gewisse Vertrautheit. 71 00:04:01,590 --> 00:04:03,780 Jetzt werden wir auf dem Weg zu Befehl Zeilenargumente, die sein wird werden 72 00:04:03,780 --> 00:04:05,890 ziemlich relevant zu dieser Problem-Set. 73 00:04:05,890 --> 00:04:09,670 >> Also bis jetzt, wann immer Sie haben Ihre Hauptfunktion erklärt, haben wir 74 00:04:09,670 --> 00:04:11,230 die int main nichtig. 75 00:04:11,230 --> 00:04:14,070 So nichtig bedeutet nur, dass wir nicht vorbei jede 76 00:04:14,070 --> 00:04:16,440 Argumente für diese Funktion. 77 00:04:16,440 --> 00:04:19,190 Jetzt werden wir sehen, dass die Haupt kann einige Argumente zu nehmen. 78 00:04:19,190 --> 00:04:22,470 Hier nennen wir sie int argc und String argv Klammern. 79 00:04:22,470 --> 00:04:26,930 Die Klammern erneut anzeigt dass wir den Umgang mit Arrays. 80 00:04:26,930 --> 00:04:31,850 Also hier, string argv Klammern, wir sind Umgang mit einem Array von Strings. 81 00:04:31,850 --> 00:04:35,360 So argc, das wird sich zeigen, wie viele Argumente, die wir haben 82 00:04:35,360 --> 00:04:37,580 zu diesem Programm geführt. 83 00:04:37,580 --> 00:04:46,050 Und um zu sehen, was das bedeutet, Lassen Sie uns diese zu schließen. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Also bis jetzt haben wir jeden laufen Programm wie dot Strich Alters. 86 00:04:50,790 --> 00:04:55,250 Wir können auch in der Befehlszeile, vorbei Argumente übergeben, damit der Begriff, Befehl 87 00:04:55,250 --> 00:04:56,550 Zeilenargumente. 88 00:04:56,550 --> 00:04:59,760 Also das erste Argument, hallo Welt. 89 00:04:59,760 --> 00:05:03,350 Also hier wäre argc drei sein. 90 00:05:03,350 --> 00:05:07,720 Es ist die Anzahl der Argumente auf der Kommandozeile. 91 00:05:07,720 --> 00:05:12,840 Argc immer mindestens 1, da Punkt Schrägstrich Altersstufen, selbst, gilt als einer der 92 00:05:12,840 --> 00:05:14,490 die Befehlszeilenargumente. 93 00:05:14,490 --> 00:05:17,010 >> Dann ist die erste hallo. 94 00:05:17,010 --> 00:05:20,460 Wenn die Dot-Schrägstrich Altersgruppen ist das nullte, dann hallo ist das erste und weltweit ist die 95 00:05:20,460 --> 00:05:22,830 zweiten Befehlszeilenargument. 96 00:05:22,830 --> 00:05:29,490 Also der String argv, wir werden sehen, enthält die Saiten, Punkt Schrägstrich 97 00:05:29,490 --> 00:05:33,830 Alter, hallo, und der Welt. 98 00:05:33,830 --> 00:05:38,945 Und durch David Anfrage, wir gehen , um ein Video, dass die Einführung zu spielen. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [VIDEO PLAYBACK] 101 00:05:43,890 --> 00:05:46,240 >> -Bis jetzt in Programme, die wir haben geschrieben, wir erklären 102 00:05:46,240 --> 00:05:48,500 Haupt als int main nichtig. 103 00:05:48,500 --> 00:05:51,170 Und die ganze Zeit, hat diese Lücke einfach ist die Angabe, dass die 104 00:05:51,170 --> 00:05:54,430 Programm übernimmt keinerlei Befehlszeilenargumente. 105 00:05:54,430 --> 00:05:57,750 In anderen Worten, wenn ein Benutzer ein Programm, kann er oder sie Befehl bereitzustellen 106 00:05:57,750 --> 00:06:01,710 Zeilenargumente durch das Schreiben von zusätzlichen Wörter oder Sätze, nachdem die Programm 107 00:06:01,710 --> 00:06:03,000 Namen bei der Eingabeaufforderung. 108 00:06:03,000 --> 00:06:06,550 >> Nun, wenn Sie Ihr Programm wollen nehmen Befehlszeilenargumente ein oder 109 00:06:06,550 --> 00:06:10,540 mehr solche Worte müssen wir ersetzen Erlöschen mit einem Paar von Argumenten. 110 00:06:10,540 --> 00:06:12,200 Also lassen Sie uns das tun. 111 00:06:12,200 --> 00:06:15,750 Fügen CS50.h. 112 00:06:15,750 --> 00:06:19,360 Fügen Standard io.h. 113 00:06:19,360 --> 00:06:20,760 Haupt Int. 114 00:06:20,760 --> 00:06:26,330 Und nun, statt der Leere, ich werde geben Sie eine int argc genannt, und ein 115 00:06:26,330 --> 00:06:28,780 String-Array argv genannt. 116 00:06:28,780 --> 00:06:31,820 Jetzt argc und argv sind einfach Konventionen. 117 00:06:31,820 --> 00:06:34,000 >> Wir konnten diese Argumente genannt haben die meisten, was wir wollen. 118 00:06:34,000 --> 00:06:37,630 Aber was wichtig ist, ist, dass argc ist ein int, da per Definition, ist es 119 00:06:37,630 --> 00:06:41,360 gehen, um das Argument Zahl enthalten, die Anzahl der Wörter im Gesamt dass die 120 00:06:41,360 --> 00:06:43,380 Benutzer hat auf seine oder ihre Aufforderung eingegeben. 121 00:06:43,380 --> 00:06:47,910 argv, mittlerweile, Argument-Vektor ist gehen, um tatsächlich ein Array zu speichern sein 122 00:06:47,910 --> 00:06:52,020 alle Wörter, die der Benutzer an seinem Eingabeaufforderung eingegeben. 123 00:06:52,020 --> 00:06:54,500 >> Lassen Sie uns gehen jetzt etwas tun mit einem oder mehreren von diesen 124 00:06:54,500 --> 00:06:55,660 Befehlszeilenargumente. 125 00:06:55,660 --> 00:07:00,070 Insbesondere wollen wir weiter gehen und drucken was auch immer Wort der Benutzer 126 00:07:00,070 --> 00:07:03,960 nach den Namen des Programms an der Eingabeaufforderung. 127 00:07:03,960 --> 00:07:04,730 Offene Halterung. 128 00:07:04,730 --> 00:07:06,240 Klammer zu. 129 00:07:06,240 --> 00:07:10,510 Printf Prozent s Backslash und Komma. 130 00:07:10,510 --> 00:07:14,550 Und jetzt muss ich sagen, welchen Wert printf in diese Platzhalter-Stecker. 131 00:07:14,550 --> 00:07:18,600 Ich möchte das erste Wort, dass der Benutzer nach den Namen des Programms eingegeben, 132 00:07:18,600 --> 00:07:23,130 und so werde ich angeben argv Winkel 1, in der Nähe 133 00:07:23,130 --> 00:07:24,830 Klammern, Semikolon. 134 00:07:24,830 --> 00:07:27,290 >> Nun, warum Winkel 1 und nicht die Halterung 0? 135 00:07:27,290 --> 00:07:30,990 Nun stellt sich heraus, automatisch gespeichert in argv 0 sein wird, die 136 00:07:30,990 --> 00:07:32,620 tatsächlichen Namen Programms. 137 00:07:32,620 --> 00:07:36,180 Also das erste Wort, das der Benutzer nach den Namen des Programms ist, durch 138 00:07:36,180 --> 00:07:38,990 Konvention sein wird in argv 1 gespeichert. 139 00:07:38,990 --> 00:07:42,380 Lassen Sie uns nun kompilieren und führen Sie dieses Programm. 140 00:07:42,380 --> 00:07:47,780 >> Machen argv 0, Punkt Strich argv 0. 141 00:07:47,780 --> 00:07:50,520 Und nun ein Wort wie hallo. 142 00:07:50,520 --> 00:07:51,670 Sie Enter. 143 00:07:51,670 --> 00:07:53,520 Und da haben wir es, hallo. 144 00:07:53,520 --> 00:07:55,750 >> [END VIDEO PLAYBACK] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: In Ordnung. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Schließen, dass. 148 00:08:01,230 --> 00:08:16,730 So nehmen Sie einen Blick auf dieses Programm, das wir uns nur eingeführt, gut, nur 149 00:08:16,730 --> 00:08:24,710 um zu zeigen, wenn wir argv 0 zu drucken, zu machen, jetzt was ist es, argv 0, Punkt Strich argv 0. 150 00:08:24,710 --> 00:08:30,440 Also, wie erwartet, es ist Ausdruck der Name des Programms, da argv 0 151 00:08:30,440 --> 00:08:32,970 immer sein wird die Name des Programms. 152 00:08:32,970 --> 00:08:35,640 Aber lassen Sie uns etwas ein etwas interessanter. 153 00:08:35,640 --> 00:08:42,080 >> So in der Problem-Set, werden Sie dieser Funktion atoi eingeführt. 154 00:08:42,080 --> 00:08:44,440 Also, was tun wir für atoi? 155 00:08:44,440 --> 00:08:48,550 Das wird ein konvertieren String in einen Integer. 156 00:08:48,550 --> 00:08:53,280 Also, wenn ich übergeben Sie die Zeichenfolge ein, zwei, drei, zu atoi, werde das zu konvertieren, dass 157 00:08:53,280 --> 00:08:56,910 der ganzen Zahl, eins zwei drei. 158 00:08:56,910 --> 00:09:01,480 So werden wir, um die erste konvertieren Befehlszeilenargument auf eine ganze Zahl, 159 00:09:01,480 --> 00:09:05,690 und dann einfach ausdrucken, dass die Ganzzahl. 160 00:09:05,690 --> 00:09:09,680 >> Also im Grunde, Art der wir Neuimplementierung getint, nur die 161 00:09:09,680 --> 00:09:12,350 Ganzzahl wird in der Befehls eingegeben Zeile statt im Programm 162 00:09:12,350 --> 00:09:14,560 interaktiv. 163 00:09:14,560 --> 00:09:23,170 Also, was argv 0, machen wir es hier, und schließen Sie, dass. 164 00:09:23,170 --> 00:09:27,670 So läuft argv 0, und wir geben die integer, eins zwei drei vier eins zwei. 165 00:09:27,670 --> 00:09:30,840 So werde es die ganze Zahl zu drucken, ein zwei drei vier eins zwei. 166 00:09:30,840 --> 00:09:35,500 Es gibt einige Feinheiten zu atoi es wird keine Gedanken über alles 167 00:09:35,500 --> 00:09:39,040 über einen gültigen numerischen Zeichen, aber das spielt keine Rolle. 168 00:09:39,040 --> 00:09:42,870 >> Also, was glauben Sie, passiert wenn ich das tun? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Segmentation fault. 171 00:09:47,050 --> 00:09:50,410 Also, warum ist das so? 172 00:09:50,410 --> 00:09:56,060 Wenn Sie zurückblicken auf unser Programm, wir sind Umwandlung argv 1, das erste Argument 173 00:09:56,060 --> 00:09:59,610 nach dem Programmnamen, auf eine ganze Zahl. 174 00:09:59,610 --> 00:10:03,350 Aber es gibt kein Argument übergeben nach dem Programmnamen. 175 00:10:03,350 --> 00:10:08,060 So, hier sehen wir, dass dies ein Buggy Programm, da, wenn wir versuchen, es laufen 176 00:10:08,060 --> 00:10:10,530 ohne Argumente, es wird nur abstürzen. 177 00:10:10,530 --> 00:10:16,950 >> Also ein weiteres gemeinsames Muster werden Sie sehen, ist so etwas wie, wenn argc weniger 178 00:10:16,950 --> 00:10:21,100 als zwei, was anzeigt, dass es nicht zumindest der Name des Programms und 179 00:10:21,100 --> 00:10:29,100 erste Argument, dann werden wir etwas tun wie printf, nicht genug 180 00:10:29,100 --> 00:10:31,190 Befehlszeilenargumente. 181 00:10:31,190 --> 00:10:33,170 Das ist wahrscheinlich nicht gut zu drucken, es ist wohl so etwas, wie 182 00:10:33,170 --> 00:10:35,440 sollten Sie eine ganze Zahl eingeben auf der Kommandozeile. 183 00:10:35,440 --> 00:10:37,450 Ich werde nur am Ende es dort. 184 00:10:37,450 --> 00:10:39,600 Und dann wieder ein. 185 00:10:39,600 --> 00:10:44,740 Also denken Sie daran, dass am Ende unserer Programm, wenn wir 0 zurück, diese Art der 186 00:10:44,740 --> 00:10:47,060 zeigt Erfolg. 187 00:10:47,060 --> 00:10:50,940 Und Haupt auch automatisch 0 zurück, wenn Sie nicht zu tun. 188 00:10:50,940 --> 00:10:55,800 >> Also hier, wir Umstimmung ein, um anzuzeigen, , dass das nicht den Erfolg. 189 00:10:55,800 --> 00:11:01,000 Und Sie können zurückkehren, was Sie wollen, gerade, 0 bedeutet Erfolg, und 190 00:11:01,000 --> 00:11:03,390 alles andere zeigt Versagen. 191 00:11:03,390 --> 00:11:04,855 Also lasst uns laufen diese Version der Dinge. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 So, jetzt, wenn wir geben nicht eine Befehlszeile Argument, wird es richtig zu sagen 194 00:11:16,600 --> 00:11:18,290 uns, nicht genug Befehlszeile. 195 00:11:18,290 --> 00:11:20,610 Haben Sie nicht den Satz zu beenden. 196 00:11:20,610 --> 00:11:24,950 Andernfalls, wenn wir tatsächlich geben sie ein, es kann das Programm ab. 197 00:11:24,950 --> 00:11:27,920 Also das ist, wie Sie in arge verwenden würden Um die Anzahl der zu validieren 198 00:11:27,920 --> 00:11:30,630 Befehlszeilenargumente, dass tatsächlich bestanden. 199 00:11:30,630 --> 00:11:39,360 >> Lassen Sie uns also dieses Programm ein bisschen mehr kompliziert, und Blick auf die zweite 200 00:11:39,360 --> 00:11:42,180 Iteration der Dinge. 201 00:11:42,180 --> 00:11:46,310 So, jetzt sind wir nicht nur den Druck der ersten Befehlszeilenargument. 202 00:11:46,310 --> 00:11:51,210 Hier werden wir von int i equals laufen 0, i weniger als argc, i plus 203 00:11:51,210 --> 00:11:55,280 plus, und Druck argv Index i. 204 00:11:55,280 --> 00:11:59,300 Damit dieses Muster wieder, das ist die gleiche Muster wie vorher, außer dass 205 00:11:59,300 --> 00:12:02,600 der Aufruf der variablen n verwenden wir argc. 206 00:12:02,600 --> 00:12:09,520 >> Also das ist über jeden Index laufen in der Matrix, und jedes Druck 207 00:12:09,520 --> 00:12:11,910 Element in diesem Array. 208 00:12:11,910 --> 00:12:20,300 Und so, wenn wir dieses Programm ausführen, gut, Ich habe nicht einen beliebigen Befehlszeile 209 00:12:20,300 --> 00:12:22,540 Argumente, so dass es nur Drucke Name das Programm. 210 00:12:22,540 --> 00:12:26,053 Gebe ich ein paar Dinge, wird es drucken ein, die jeweils in einer eigenen Zeile. 211 00:12:26,053 --> 00:12:31,213 212 00:12:31,213 --> 00:12:32,210 >> OK. 213 00:12:32,210 --> 00:12:34,770 Werfen wir also einen Schritt weiter. 214 00:12:34,770 --> 00:12:38,890 Und statt dem Drucken jedes Argument in einer eigenen Zeile, lassen Sie drucken jedes 215 00:12:38,890 --> 00:12:42,590 Charakter der einzelnen Argumente in einer eigenen Zeile. 216 00:12:42,590 --> 00:12:46,700 Also denken Sie daran, dass argv ist ein Array von Strings. 217 00:12:46,700 --> 00:12:50,960 Also, was ist ein String, aber ein Array von Zeichen? 218 00:12:50,960 --> 00:12:57,140 Das heißt also, dass argv ist wirklich eine Array aus einer Anordnung von Zeichen. 219 00:12:57,140 --> 00:13:04,920 So nutzt, dass, ignorieren wir das jetzt. 220 00:13:04,920 --> 00:13:08,190 Lassen Sie uns nur überlegen den String argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Wenn wir also jedes Zeichen bringen wollen argv 0 in einer eigenen Zeile, dann will ich 222 00:13:14,170 --> 00:13:19,500 , um das Muster wir es gewohnt sind zu tun, ist i kleiner ist als die Länge des Arrays, 223 00:13:19,500 --> 00:13:23,990 die hier ist von strlen, das ist nicht das, was ich tun möchte, string 224 00:13:23,990 --> 00:13:26,450 s entspricht argv 0. 225 00:13:26,450 --> 00:13:30,390 So dass weniger als die Länge der i Anordnung, die in diesem Fall ist ein Array 226 00:13:30,390 --> 00:13:34,410 von Zeichen, i plus plus. 227 00:13:34,410 --> 00:13:41,040 Und so, wie wir letzte Woche gesehen haben, ist es ideal wenn wir uns bewegen, dass außerhalb strlen 228 00:13:41,040 --> 00:13:45,210 der Zustand wird, da das Hinzufügen n die strlen von s jedes Mal, wenn wir 229 00:13:45,210 --> 00:13:47,720 durch die Schlaufe, und es ist nicht sich zu ändern. 230 00:13:47,720 --> 00:13:50,230 Also werden wir es gleich n hier eingestellt. 231 00:13:50,230 --> 00:13:54,260 232 00:13:54,260 --> 00:13:55,170 >> OK. 233 00:13:55,170 --> 00:14:01,320 So, jetzt sind wir Laufen jeder Index im Array. 234 00:14:01,320 --> 00:14:05,630 Und so, wenn wir jedes drucken möchten Charakter in diesem Array, c Prozent ist 235 00:14:05,630 --> 00:14:06,880 die Flagge wollen wir nutzen für Zeichen. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 Und jetzt ist ein Träger i sein wird die String, Index-Zeichen i, also, wenn die 238 00:14:19,770 --> 00:14:20,970 String waren hallo. 239 00:14:20,970 --> 00:14:27,530 dann s 0 wird sich h, s Halterung E 1 wird, und so weiter. 240 00:14:27,530 --> 00:14:30,800 >> So nun zu kombinieren, wollen wir diese beiden Dinge. 241 00:14:30,800 --> 00:14:35,440 Wir wollen jedes Zeichen drucken jeder Befehlszeilenargument. 242 00:14:35,440 --> 00:14:38,950 So werden wir zu haben, für eine Schleife verschachtelt. 243 00:14:38,950 --> 00:14:47,480 Und üblicherweise der erste Zähler Ich bin es, der nächste wird sich j, n 244 00:14:47,480 --> 00:14:54,450 wird die strlen von argv ich sein, ich kleiner ist als n, i plus plus. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 Und nun anstelle von Druck argv i, so argv Halterung i mit Index geht - 247 00:15:06,870 --> 00:15:14,280 das wird das i-te Befehlszeile sein Argument, argv i, j wird sich 248 00:15:14,280 --> 00:15:16,925 sein, die j-te Charakter der i-te Argument. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Ich werde dies hier jetzt loswerden da wir es in dieser Schleife. 251 00:15:24,810 --> 00:15:33,900 So entspricht der String s equals argv i, s und dann Klammer j. 252 00:15:33,900 --> 00:15:36,980 >> Nun, wir brauchen nicht zu erklären diese Variable s. 253 00:15:36,980 --> 00:15:44,530 Stattdessen werden wir einfach kombinieren diese zwei in das, was wir hatten, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> Sprecher 1: [unverständlich]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: Guter Ruf. 257 00:15:49,680 --> 00:15:52,936 Das ist also gebrochen. 258 00:15:52,936 --> 00:15:55,510 Wenn ich tatsächlich lief es, wir würden haben dies erkannt. 259 00:15:55,510 --> 00:16:01,210 Also das Gegen Ich kümmere mich um in diesem speziellen für 260 00:16:01,210 --> 00:16:05,410 Schleife ist j, der Iterator. 261 00:16:05,410 --> 00:16:08,560 Also würden Sie in Probleme ausgeführt haben, wahrscheinlich eine unendliche Schleife, wenn man 262 00:16:08,560 --> 00:16:09,540 war nicht festgelegt, dass. 263 00:16:09,540 --> 00:16:12,220 Das ist, warum wir auch im Gespräch zum Debuggen von heute. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Also lassen Sie dieses Programm ausführen. 266 00:16:15,240 --> 00:16:21,200 Und lassen Sie uns tatsächlich fügen Sie einen separaten printf hier, die gerade gedruckt werden 267 00:16:21,200 --> 00:16:27,480 eine andere Linie, da dies bedeutet, wenn wir führen Sie das Programm, es werde ein leer sein 268 00:16:27,480 --> 00:16:31,830 Linie zwischen den einzelnen Zeichen der jede Befehlszeilenargument. 269 00:16:31,830 --> 00:16:33,448 Nun, wir werden sehen, was das bedeutet. 270 00:16:33,448 --> 00:16:37,310 271 00:16:37,310 --> 00:16:37,790 Oop. 272 00:16:37,790 --> 00:16:39,870 Haben Sie einige Fehler. 273 00:16:39,870 --> 00:16:42,860 Fehler implizit erklärt Bibliotheksfunktion strlen. 274 00:16:42,860 --> 00:16:51,630 >> So gehen zurück in unser Programm, ich vergessen, hash gehören string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 So string.h sein wird, die Headerdatei, die erklärt, 277 00:16:57,730 --> 00:16:58,980 die Funktion strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, kompiliert es. 280 00:17:06,060 --> 00:17:09,109 Nun, lassen Sie es laufen. 281 00:17:09,109 --> 00:17:10,930 Also gerade die. 282 00:17:10,930 --> 00:17:17,790 Es geht um unsere ausdrucken Programmnamen, hallo Welt. 283 00:17:17,790 --> 00:17:23,510 Es wird jedes Ding drucken, jeweils Charakter haben, auf seine eigene Linie. 284 00:17:23,510 --> 00:17:24,540 OK. 285 00:17:24,540 --> 00:17:30,625 >> Lassen Sie uns also tatsächlich nehmen diese einen Schritt weiter. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 Und statt mit string.h, lassen darüber nachdenken, wie wir würden unsere eigenen implementieren 288 00:17:39,700 --> 00:17:41,420 strlen-Funktion. 289 00:17:41,420 --> 00:17:45,600 Also werde ich sofort geben eine Funktion Unterschrift. 290 00:17:45,600 --> 00:17:52,900 Lassen Sie uns also in my_strlen nennen, und es ist gehen, um einen String als Argument zu nehmen, 291 00:17:52,900 --> 00:17:57,220 und wir erwarten, dass die Rückkehr Länge dieser Zeichenfolge. 292 00:17:57,220 --> 00:18:03,430 Also, wo ist dieser Kerl? 293 00:18:03,430 --> 00:18:04,990 Ja. 294 00:18:04,990 --> 00:18:06,740 OK. 295 00:18:06,740 --> 00:18:12,900 Also denken Sie daran aus der früheren Folie, war auch von der letzten Woche, dass ein 296 00:18:12,900 --> 00:18:18,890 Array von Zeichen, nun ja, ein String ist, so sagen wir, das ist unser String s. 297 00:18:18,890 --> 00:18:29,870 Also, wenn s ist der String, hallo, dann, H-E-L-L-O, in Erinnerung, das wird 298 00:18:29,870 --> 00:18:35,610 sein, und dann dieses Backslash 0 Charakter. 299 00:18:35,610 --> 00:18:39,170 >> So, wie wir die Länge s bekommen? 300 00:18:39,170 --> 00:18:43,190 Nun, das ist der Trick für diese Suche spiel 0 Charakter, dieses null 301 00:18:43,190 --> 00:18:44,380 Terminator. 302 00:18:44,380 --> 00:18:50,270 Also der Algorithmus Bevorstehende so etwas wie wenige sein 303 00:18:50,270 --> 00:18:51,510 Zeichen genug, dass - 304 00:18:51,510 --> 00:18:56,180 lassen Sie uns diese Hand stellen einige Zähler, nennen wir diese int length. 305 00:18:56,180 --> 00:19:00,060 So, ab hier, wir sind gehen über unsere String durchlaufen. 306 00:19:00,060 --> 00:19:04,100 >> So ist der erste Charakter, es ist H, und es ist nicht wieder zu senken 0, so 307 00:19:04,100 --> 00:19:05,170 die Länge 1 ist. 308 00:19:05,170 --> 00:19:08,050 Durchlaufen, um das nächste Zeichen, E, und es ist nicht Backslash 0. 309 00:19:08,050 --> 00:19:09,630 Die Länge ist 2. 310 00:19:09,630 --> 00:19:10,960 L, 3. 311 00:19:10,960 --> 00:19:11,850 L, 4. 312 00:19:11,850 --> 00:19:13,050 O, 5. 313 00:19:13,050 --> 00:19:16,690 Und schließlich erreichen wir Backslash 0, und so, dass Mittel, gut, 314 00:19:16,690 --> 00:19:17,780 Diese Saite ist vorbei. 315 00:19:17,780 --> 00:19:20,130 Lassen Sie uns also zurück 5. 316 00:19:20,130 --> 00:19:33,630 >> Also eigentlich die Umsetzung, dass, erstens, meine Länge n gleich 0 ist, meiner rechten Hand. 317 00:19:33,630 --> 00:19:36,088 Und wir werden durchlaufen - 318 00:19:36,088 --> 00:19:38,000 >> Sprecher 1: [unverständlich] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Oh, schießen. 320 00:19:38,640 --> 00:19:39,870 Guter Ruf. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Also Länge n gleich 0 ist. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 So, jetzt tut, während s Länge nicht gleich und dann Backslash 0. 325 00:19:58,310 --> 00:20:04,660 Also denken Sie daran, diese Backslash 0 ist, ist es ein tatsächlichen Charakter, und es zeigt 326 00:20:04,660 --> 00:20:05,820 das Ende der Zeichenfolge. 327 00:20:05,820 --> 00:20:09,850 Genau wie auch Backslash n ist eine tatsächliche Charakter. 328 00:20:09,850 --> 00:20:14,040 Backslash 0 wird, um anzuzeigen, das Ende unserer String. 329 00:20:14,040 --> 00:20:15,414 Ich will nicht, dass es gestellt. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 Und während s durch Länge ist nicht indiziert gleich dem Nullabschluss, dann 332 00:20:25,620 --> 00:20:27,130 wir sind gerade dabei, Länge zu erhöhen. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Also dann, am Ende unseres Programms, Länge wird schließlich werde 335 00:20:34,880 --> 00:20:37,610 5 ist in diesem Fall. 336 00:20:37,610 --> 00:20:39,210 Und wir werden nur Länge zurück. 337 00:20:39,210 --> 00:20:42,570 338 00:20:42,570 --> 00:20:43,530 >> OK. 339 00:20:43,530 --> 00:20:48,290 So, jetzt hier unten, ich nicht my_strlen tun. 340 00:20:48,290 --> 00:20:50,700 Lassen Sie kompilieren Sie es, um sicherzustellen, alles reibungslos läuft. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 War ich dabei in 2? 343 00:20:58,210 --> 00:21:00,565 Oder war das ein? 344 00:21:00,565 --> 00:21:01,940 Das sollte zu tun. 345 00:21:01,940 --> 00:21:02,690 Gut. 346 00:21:02,690 --> 00:21:08,490 Das ist also argv 2. 347 00:21:08,490 --> 00:21:11,585 Funktioniert wie erwartet, obwohl war, dass die, die ich tat es? 348 00:21:11,585 --> 00:21:15,060 349 00:21:15,060 --> 00:21:15,550 Ja. 350 00:21:15,550 --> 00:21:16,760 OK. 351 00:21:16,760 --> 00:21:21,820 Diese Version der Dinge nicht haben printf neue Zeile nach, aber es 352 00:21:21,820 --> 00:21:22,910 macht keinen Unterschied. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 So arbeitete wie erwartet. 355 00:21:25,780 --> 00:21:34,750 >> Jetzt können wir sogar noch einen Schritt kombinieren weiter, wo Ankündigung hier, nun, 356 00:21:34,750 --> 00:21:38,920 zuerst, wir greifen die strlen von argv i, und dann sind wir Laufen 357 00:21:38,920 --> 00:21:41,450 jedes Zeichen in diesem String. 358 00:21:41,450 --> 00:21:47,480 Also anstatt das zu tun, was, wenn wir nur diese Logik des Wartens kombinieren 359 00:21:47,480 --> 00:21:50,740 bis wir umgekehrten Schrägstrich rechts 0 in dieser for-Schleife? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 So durchlaufen, während argv i, j tut Backslash nicht gleich null. 362 00:22:07,490 --> 00:22:10,680 Lassen Sie uns also führen Sie es zuerst. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Gut. 365 00:22:21,180 --> 00:22:27,655 So, hier ist diese Bedingung sagen - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 Lassen Sie uns klar, dass. 368 00:22:40,060 --> 00:22:49,140 So, jetzt lassen Sie diese unsere argv sein. 369 00:22:49,140 --> 00:22:55,290 Also, wenn ich das Programm kurz vor lief, argv ist ein Array von Strings. 370 00:22:55,290 --> 00:23:03,100 Und so, wenn ich es mit Punkt Strich argv 2, hallo Welt, dann die argv 371 00:23:03,100 --> 00:23:07,650 selbst ist Länge 3, für argv Null, hallo, und der Welt. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> Und innerhalb jeder dieser Indizes ist, selbst ein Array, wo dies sein werde 374 00:23:19,660 --> 00:23:23,780 dot, wird dies Strich zu sein, weiß ich nicht, wenn das die richtige Richtung, ich 375 00:23:23,780 --> 00:23:25,680 glaube nicht, dass es war. 376 00:23:25,680 --> 00:23:30,110 A-R-V Bindestrich, brauchen mehr Platz. 377 00:23:30,110 --> 00:23:32,570 Lassen Sie uns in diesem Array abgeschnitten. 378 00:23:32,570 --> 00:23:38,230 A-R-V Armaturenbrett 0, 0 und dann Backslash. 379 00:23:38,230 --> 00:23:43,160 Und dann in Unordnung sein hallo. 380 00:23:43,160 --> 00:23:45,910 Lassen Sie uns sagen, H-E 0 Backslash. 381 00:23:45,910 --> 00:23:51,130 Und schließlich, W-O Backslash 0. 382 00:23:51,130 --> 00:23:59,730 >> Also der Algorithmus, den wir gerade geschrieben haben, die verschachtelte for-Schleifen, was sie sind 383 00:23:59,730 --> 00:24:07,321 tun ist, müssen wir zunächst die Zähler i und j dann. 384 00:24:07,321 --> 00:24:15,206 Das wäre einfacher mit Code auf der Bildschirm, wir zurück zu diesem gehen. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 So fest, dass i die Iterator, ist Iteration über jeden Befehl 387 00:24:24,600 --> 00:24:25,610 Zeilenargument. 388 00:24:25,610 --> 00:24:28,870 Und j die Iterator Iterieren über jedes Zeichen, dass 389 00:24:28,870 --> 00:24:30,410 Befehlszeilenargument. 390 00:24:30,410 --> 00:24:46,755 Also, was tut innersten printf ist, haben wir argv 0 0, printf printf 391 00:24:46,755 --> 00:24:58,680 argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, aber jetzt, argv 0 7 wird zu 392 00:24:58,680 --> 00:25:00,670 Backslash gleich null. 393 00:25:00,670 --> 00:25:05,730 >> So beenden wir die for-Schleife und jetzt läuft i auf 1. 394 00:25:05,730 --> 00:25:10,910 Und jetzt sind wir die Druck gehen argv 1 0, argv 1 1 - 395 00:25:10,910 --> 00:25:17,040 Nun, jetzt, da ich kurz geschnitten hallo, argv 1 2 wieder sein wird 396 00:25:17,040 --> 00:25:18,170 0 Backslash. 397 00:25:18,170 --> 00:25:25,050 Und so, erhöhe i und weiter, und so weiter, bis wir alle drucken 398 00:25:25,050 --> 00:25:28,580 Welt, und das sind drei Befehlszeile Argumente, und wir werden aus beenden 399 00:25:28,580 --> 00:25:31,670 die äußerste Schleife, und Abschluss unseres Programms. 400 00:25:31,670 --> 00:25:38,390 401 00:25:38,390 --> 00:25:39,640 OK. 402 00:25:39,640 --> 00:25:43,903 403 00:25:43,903 --> 00:25:46,795 >> Lassen Sie uns also wieder hier. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 So haben Sie eine gewisse Vertrautheit mit gewinnen Befehlszeilenargumente auf diese 406 00:25:52,370 --> 00:25:54,460 besonderes Problem eingestellt. 407 00:25:54,460 --> 00:25:56,630 >> Jetzt, Debugging. 408 00:25:56,630 --> 00:26:01,680 So haben Sie wahrscheinlich schon zu tun hatte, einige Debugging mit Ihrer bisherigen 409 00:26:01,680 --> 00:26:03,120 Problem eingestellt. 410 00:26:03,120 --> 00:26:08,420 Und eine sehr einfache Möglichkeit, Debugging, Zuerst schauen wir uns an einem Buggy-Programm. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Nun, zu Fuß durch dieses Programm wir gehen, um den Benutzer für eine frage 413 00:26:23,830 --> 00:26:29,350 ganze Zahl ist, greifen diese ganze Zahl ist, und dann, beliebig, haben wir eine while-Schleife, 414 00:26:29,350 --> 00:26:32,280 ist gerade dabei zu verringern i bis es gleich 10 ist. 415 00:26:32,280 --> 00:26:35,820 Sagen wir einfach davon ausgehen, ich bin der Eingabe eine ganze Zahl größer als 10 ist. 416 00:26:35,820 --> 00:26:38,700 I so dekrementieren, bis sie gleich 10 ist. 417 00:26:38,700 --> 00:26:42,630 >> Und dann haben wir eine weitere while-Schleife dass, während ich nicht gleich 0 ist, sind wir 418 00:26:42,630 --> 00:26:44,540 werde ich um 3 zu verringern. 419 00:26:44,540 --> 00:26:49,790 Also, wenn Sie die Absicht der Fehler sehen hier ist es, dass diese werde ich zu verringern 420 00:26:49,790 --> 00:26:57,010 10 sein, und dann wird diese while-Schleife Willen Dekrement i von 10, 7, 4, 1, 421 00:26:57,010 --> 00:27:02,880 negativer 2, negative 5, und so weiter, negative Unendlichkeit, da ich 422 00:27:02,880 --> 00:27:05,920 eigentlich nie gleich null. 423 00:27:05,920 --> 00:27:08,610 Und dann am Ende des Programms, wir haben die Funktion, die foo ist 424 00:27:08,610 --> 00:27:12,130 los Ausdruck, dass i. 425 00:27:12,130 --> 00:27:16,520 >> Also das ist eine kurze und triviale Programm, und der Fehler ist offensichtlich, 426 00:27:16,520 --> 00:27:18,790 besonders nachdem ich gerade sagte, was der Fehler war. 427 00:27:18,790 --> 00:27:24,840 Aber die Absicht ist hier, nun, dies könnte tatsächlich, wie einige schauen Sie 428 00:27:24,840 --> 00:27:30,040 Lösungen von gierig aus der letzten Problem eingestellt, und vielleicht haben Sie 429 00:27:30,040 --> 00:27:32,800 einige Endlosschleife im Programm, und Sie haben keine Ahnung 430 00:27:32,800 --> 00:27:34,100 was es verursacht. 431 00:27:34,100 --> 00:27:38,690 Also ein sehr nützliches Debugging-Technik ist, nur printfs hinzufügen 432 00:27:38,690 --> 00:27:40,180 ganzen Code. 433 00:27:40,180 --> 00:27:49,200 >> So, hier möchte ich eine printf außerhalb erste while-Schleife. 434 00:27:49,200 --> 00:27:53,155 Und hier möchte ich ein printf, und ich werde einfach ausdrucken i. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Ich werde sogar zuerst tun while-Schleife, i. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 Draußen zweite while-Schleife. 439 00:28:09,040 --> 00:28:12,170 Wieder einmal innerhalb drucken hier der Wert i. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 Und lassen Sie uns diese laufen. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> So dot Strich debuggen. 444 00:28:24,800 --> 00:28:25,610 Geben Sie eine ganze Zahl ist. 445 00:28:25,610 --> 00:28:28,150 Lassen Sie uns 13. 446 00:28:28,150 --> 00:28:28,760 Und Boom. 447 00:28:28,760 --> 00:28:33,300 Wir sehen, dass wir Endlosschleife Innenseite der zweiten while-Schleife. 448 00:28:33,300 --> 00:28:36,305 So, jetzt wissen wir, was der Fehler ist. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Aber printf-Debugging ist durchaus groß, aber wenn Sie Ihre Programme bekommen 451 00:28:45,610 --> 00:28:50,560 mehr und mehr kompliziert, es anspruchsvollere Lösungen 452 00:28:50,560 --> 00:28:51,705 Getting Things tätig. 453 00:28:51,705 --> 00:28:52,955 So entfernen wir alle diese printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 Und lassen Sie uns sicherstellen, dass ich nicht brechen nichts. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Also das Programm werden wir einzuführen heißt 458 00:29:14,180 --> 00:29:16,715 GDB, für GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Na ja, eigentlich, entfernen wir für Debug- eine zweite, und stellen Debug wieder. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Na ja, eigentlich zunächst eine gute Lektion im Kommandozeilen-Argumente. 463 00:29:34,440 --> 00:29:37,780 Beachten Sie, dass diese Schall-Befehl, der ist Kompilieren alles übergeben wird 464 00:29:37,780 --> 00:29:41,300 auf der Kommandozeile, diese Befehlszeilenargumente. 465 00:29:41,300 --> 00:29:46,250 So genau, wie Sie sich zu verwenden Kommandozeilen-Argumente, wie wir 466 00:29:46,250 --> 00:29:51,500 haben, bevor und wie Sie werden in PSET 2, das ist, wie Schall wird mit ihnen. 467 00:29:51,500 --> 00:30:00,070 >> So bemerken, dass diese erste Flagge, Bindestrich ggdb3, was das ist zu sagen, Schall, 468 00:30:00,070 --> 00:30:03,790 Sie sollten diese Datei mit dem kompilieren Absicht, dass wir irgendwann 469 00:30:03,790 --> 00:30:05,380 brauchen, um es zu debuggen. 470 00:30:05,380 --> 00:30:13,840 So lange, wie Sie diese Fahne zu haben, dann können wir GDB debuggen. 471 00:30:13,840 --> 00:30:17,380 Und es wird sich öffnen Sie die GNU Debugger. 472 00:30:17,380 --> 00:30:22,920 >> So gibt es eine Menge von Befehlen, dass Sie zu gewöhnen. 473 00:30:22,920 --> 00:30:27,100 Zuerst ein, dass Sie wahrscheinlich sofort brauchen, ist Run. 474 00:30:27,100 --> 00:30:28,200 Also, was ist Führen Sie jetzt tun? 475 00:30:28,200 --> 00:30:30,910 Es geht um unser Programm zu starten. 476 00:30:30,910 --> 00:30:36,180 So laufen, Startprogramm, das Programm fragt uns, für eine ganze Zahl, 13. 477 00:30:36,180 --> 00:30:39,170 Und dann ist es als Endlosschleife erwartet, außer ich entfernt die 478 00:30:39,170 --> 00:30:40,500 printfs, so dass wir gar nicht sehen, dass. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Normalerweise verlassen. 481 00:30:44,600 --> 00:30:45,850 Oh. 482 00:30:45,850 --> 00:30:48,570 483 00:30:48,570 --> 00:30:53,640 Es ist möglich, dass es eingewickelt alle Weise um, zurück zu - zu ignorieren, dass. 484 00:30:53,640 --> 00:30:55,170 Angenommen, es hat in der Regel nicht verlassen. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Es ist eine komplizierte Antwort. 487 00:31:03,370 --> 00:31:07,890 >> So, jetzt, das ist nicht sehr nützlich. 488 00:31:07,890 --> 00:31:11,480 So einfach läuft unser Programm innerhalb von Diese Debugger hilft uns nicht in einem 489 00:31:11,480 --> 00:31:15,610 Weise, da wir gerade getan haben könnte Slash Dot Debug von außen GDB. 490 00:31:15,610 --> 00:31:21,250 Also das ein Befehl, Sie wahrscheinlich - 491 00:31:21,250 --> 00:31:22,970 und ich werde das beenden. 492 00:31:22,970 --> 00:31:25,850 Strg-d oder zu beenden, beide arbeiten. 493 00:31:25,850 --> 00:31:29,550 Lassen Sie uns also öffnen Sie sie wieder auf. 494 00:31:29,550 --> 00:31:31,130 >> Ein weiterer Befehl, dass Sie wahrscheinlich sofort wollen 495 00:31:31,130 --> 00:31:33,600 gewöhnen ist Pause. 496 00:31:33,600 --> 00:31:37,120 Also werden wir auf der Haupt für jetzt zu brechen, und dann werde ich erklären. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Nun, hier sehen wir, dass wir einen Haltepunkt an dieser Linie in debug.c. 499 00:31:46,370 --> 00:31:50,160 Also, welche Mittel Pause ist, dass, wenn ich Geben Lauf wird das Programm gehen, um 500 00:31:50,160 --> 00:31:53,560 weiter ausgeführt, bis Ich schlug einen Haltepunkt. 501 00:31:53,560 --> 00:31:59,390 Also, wenn ich getroffen Lauf, startet das Programm, und dann bricht es, sobald es 502 00:31:59,390 --> 00:32:01,940 tritt in die Hauptfunktion. 503 00:32:01,940 --> 00:32:06,930 Brechen Haupt wird etwas sein Sie ziemlich häufig zu tun. 504 00:32:06,930 --> 00:32:11,340 >> Und nun, Sie einzuführen einige weitere Befehle. 505 00:32:11,340 --> 00:32:14,330 Beachten Sie hier, dass es zu sagen, wir brach in Zeile 11, die ist 506 00:32:14,330 --> 00:32:16,230 printf, geben Sie eine ganze Zahl ist. 507 00:32:16,230 --> 00:32:21,260 Also der nächste Befehl wird sein, wie wir gehen in die nächste Zeile Code. 508 00:32:21,260 --> 00:32:24,810 Das wird es uns ermöglichen, Schritt durch unser Programm Zeile für Zeile. 509 00:32:24,810 --> 00:32:26,260 Also das nächste. 510 00:32:26,260 --> 00:32:29,820 >> Jetzt Linie 12, wir gehen die ganze Zahl zu erhalten. 511 00:32:29,820 --> 00:32:30,450 Weiter. 512 00:32:30,450 --> 00:32:34,290 Und wenn Sie einfach auf wieder betreten, werden sie wiederholen das letzte, was Sie getan haben. 513 00:32:34,290 --> 00:32:36,480 So brauche ich nicht zu geben neben jeder Zeit. 514 00:32:36,480 --> 00:32:40,100 So geben Sie eine ganze Zahl, 13. 515 00:32:40,100 --> 00:32:46,940 So, jetzt, Zeile 14, während i größer ist als 10 ist, und ich werde nächstes zu tun. 516 00:32:46,940 --> 00:32:48,685 Und wir sehen, wir werden i zu verringern. 517 00:32:48,685 --> 00:32:50,210 So werden wir bis i wieder zu verringern. 518 00:32:50,210 --> 00:32:53,620 >> So, jetzt ein weiteres nützliches Befehl Drucken. 519 00:32:53,620 --> 00:32:55,750 So drucken wird zum Ausdrucken der Wert der Variablen. 520 00:32:55,750 --> 00:32:57,825 Lassen Sie uns zu bringen, den Wert von Variable i. 521 00:32:57,825 --> 00:32:58,705 Lassen Sie drucken i. 522 00:32:58,705 --> 00:33:00,910 Es wird sagen, dass ich 11 ist. 523 00:33:00,910 --> 00:33:03,330 Jetzt werden wir Sie erneut auf Weiter, während i größer als 10 ist. 524 00:33:03,330 --> 00:33:05,590 Also habe ich immer noch größer als 10, denn es ist 11. 525 00:33:05,590 --> 00:33:06,920 i minus minus. 526 00:33:06,920 --> 00:33:08,250 Lassen Sie uns erneut zu drucken i. 527 00:33:08,250 --> 00:33:10,950 Wie erwartet, ist es 10. 528 00:33:10,950 --> 00:33:12,510 >> So, jetzt, neben. 529 00:33:12,510 --> 00:33:16,250 Es ist wieder an die Bedingung gehen, i größer als 10, aber ich ist jetzt 10, so 530 00:33:16,250 --> 00:33:20,040 es ist nicht größer als 10, so erwarten wir es, aus der while-Schleife fallen. 531 00:33:20,040 --> 00:33:22,220 Und jetzt sind wir unter dieser Zeile Code. 532 00:33:22,220 --> 00:33:28,750 Und ein anderer Befehl, Liste, ist gerade dabei die vorherige und nächste angezeigt 533 00:33:28,750 --> 00:33:31,240 Paar von Codezeilen, in Falls Sie sich selbst verloren. 534 00:33:31,240 --> 00:33:35,420 Also haben wir nur verlassen diese while-Schleife und jetzt haben wir diese eingegeben haben 535 00:33:35,420 --> 00:33:37,080 while-Schleife, Zeile 18. 536 00:33:37,080 --> 00:33:39,860 So, während ich nicht gleich 0 ist. 537 00:33:39,860 --> 00:33:46,570 Und, neben, gleich i i minus 3, und wir werden bemerken, werden diese einfach weiter. 538 00:33:46,570 --> 00:33:48,270 Und wir können i drucken. 539 00:33:48,270 --> 00:33:49,990 >> Jeder Befehl Art hat Verknüpfungen. 540 00:33:49,990 --> 00:33:51,720 Also p steht für Print. 541 00:33:51,720 --> 00:33:53,400 So können wir p i. 542 00:33:53,400 --> 00:33:57,550 Just keep holding n, oder weiterhin tun, Weiter. 543 00:33:57,550 --> 00:33:58,340 Drucken i wieder. 544 00:33:58,340 --> 00:34:00,380 Sie sehen, jetzt ist es negativ 167. 545 00:34:00,380 --> 00:34:06,030 So wird dies ewig so weitergehen, aber nicht wirklich für immer, da Sie gerade gesehen haben, ist es 546 00:34:06,030 --> 00:34:09,330 tatsächlich zu einem bestimmten Zeitpunkt zu beenden. 547 00:34:09,330 --> 00:34:15,699 >> Damit wird Anfang GDB. 548 00:34:15,699 --> 00:34:19,504 Aber lassen Sie uns noch etwas in GDB. 549 00:34:19,504 --> 00:34:20,754 Äh, debuggen. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 So, in diesem besonderen Fall die Endlosschleife passiert Innenseite sein 552 00:34:28,534 --> 00:34:30,050 die Hauptfunktion. 553 00:34:30,050 --> 00:34:35,779 Und jetzt, einfach akzeptieren, dass, was ich bin gehen, um die Endlosschleife in Bewegung 554 00:34:35,779 --> 00:34:37,029 die Funktion foo. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Denken Sie daran, dass am Ende dieses Programm, gut, das war ursprünglich 557 00:34:43,730 --> 00:34:46,210 Aufruf foo, das war einfach werde ich drucken. 558 00:34:46,210 --> 00:34:51,880 Aber jetzt sind wir rufen foo, das ist, werde ich verringern, bis es 0 ist, und 559 00:34:51,880 --> 00:34:54,548 drucken Sie dann die Variable. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Sparen, dass. 562 00:34:57,970 --> 00:35:00,175 Machen Sie debuggen. 563 00:35:00,175 --> 00:35:03,310 Und nun, gdb debuggen. 564 00:35:03,310 --> 00:35:04,090 OK. 565 00:35:04,090 --> 00:35:10,580 >> Also, wenn ich nur laufen dann werde ich nicht zu in der Lage, tatsächlich durch meinen Schritt 566 00:35:10,580 --> 00:35:11,730 Programm Zeile-für-Zeile. 567 00:35:11,730 --> 00:35:19,820 Lassen Sie uns also an den Haupt zu brechen, und geben Sie dann laufen. 568 00:35:19,820 --> 00:35:28,160 Also durch diese gehen, printf, geben Sie eine ganze Zahl, erhalten die Ganzzahl, 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 So werden wir Dekrementieren halten bis i grßer als 10 ist. 571 00:35:37,490 --> 00:35:42,840 Dann werden wir durch die zu fallen while-Schleife, und sich auf die Linie - 572 00:35:42,840 --> 00:35:44,364 öffnen wir es in einem separaten Fenster. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 So verringert man, bis ich nicht mehr war größer als 10 ist, und dann wir 575 00:35:53,300 --> 00:35:55,700 rief die Funktion foo. 576 00:35:55,700 --> 00:36:01,340 >> Also, was passiert, sobald ich getroffen Funktion foo, gut, ich rief foo, und 577 00:36:01,340 --> 00:36:04,030 dann hatte ich nicht mehr die Kontrolle über GDB. 578 00:36:04,030 --> 00:36:10,230 Also, sobald ich auf Weiter auf dieser Linie, Dinge fortgesetzt, bis das passiert, 579 00:36:10,230 --> 00:36:12,400 wo das Programm verlassen, wenn - 580 00:36:12,400 --> 00:36:14,450 annehmen, dass es nicht irgendwann existieren. 581 00:36:14,450 --> 00:36:16,390 Sie sah es für ein bisschen Pause aber. 582 00:36:16,390 --> 00:36:22,040 Also warum habe ich verlieren die Kontrolle über das Programm an diesem Punkt? 583 00:36:22,040 --> 00:36:27,540 Nun, als ich als nächstes schreiben, geht auf das die wörtliche nächste Codezeile, die 584 00:36:27,540 --> 00:36:28,850 ausgeführt wird. 585 00:36:28,850 --> 00:36:35,950 So nach Linie 21, die nächste Codezeile dass ausgeführt wird ist die Linie 22, 586 00:36:35,950 --> 00:36:38,520 Das ist, Austritt aus main. 587 00:36:38,520 --> 00:36:43,810 Also ich möchte nicht einfach gehen auf die nächste Zeile des Codes. 588 00:36:43,810 --> 00:36:48,170 Ich will in der Funktion foo gehen, und dann auch durch Schritt 589 00:36:48,170 --> 00:36:49,830 diese Codezeilen. 590 00:36:49,830 --> 00:36:53,726 >> Also für das, haben wir eine Alternative. 591 00:36:53,726 --> 00:36:56,770 Lassen Sie uns aufhören, dass wieder ein. 592 00:36:56,770 --> 00:36:58,020 Brechen Haupt. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, Weiter, Weiter, 13, nächste, Weiter, Weiter, sorgfältig, 595 00:37:06,370 --> 00:37:09,820 bevor wir Linie foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> So, jetzt sind wir in Zeile 21, wo wir rufen foo. 598 00:37:13,700 --> 00:37:17,100 Wir wollen nicht zum nächsten geben, denn das rufen Sie einfach die Funktion foo, und 599 00:37:17,100 --> 00:37:18,710 gehen in die nächste Zeile Code. 600 00:37:18,710 --> 00:37:20,840 Was wir verwenden möchten, ist Schritt. 601 00:37:20,840 --> 00:37:25,690 Es gibt also einen Unterschied zwischen Schritt und nächstes Schritt, wo Sie die Schritte in der 602 00:37:25,690 --> 00:37:28,190 funktionieren, und nächstes geht über die Funktion. 603 00:37:28,190 --> 00:37:32,830 Er führt nur die Gesamtheit der die Funktion und läuft weiter. 604 00:37:32,830 --> 00:37:37,210 >> Also Schritt wird uns bringen in der Funktion foo. 605 00:37:37,210 --> 00:37:41,160 Und wir sehen hier, jetzt sind wir wieder bei Diese while-Schleife, ist in der Theorie, 606 00:37:41,160 --> 00:37:44,190 ewig fortsetzen. 607 00:37:44,190 --> 00:37:50,420 Und wenn Sie zu schlagen Schritt, wenn es nicht sogar eine Funktion zu nennen, dann ist es 608 00:37:50,420 --> 00:37:51,720 identisch mit Weiter. 609 00:37:51,720 --> 00:37:55,320 So ist es nur, wenn Sie an einer Linie sind, die ist eine Funktion, die Schritt Aufruf 610 00:37:55,320 --> 00:37:56,970 wird sich von Next abweichen. 611 00:37:56,970 --> 00:37:57,930 Also Schritt wird uns hierher zu bringen. 612 00:37:57,930 --> 00:38:02,100 Schritt, Schritt, Schritt, Schritt, Schritt, Schritt, und Wir werden einfach Endlosschleife immer. 613 00:38:02,100 --> 00:38:06,810 >> So könnten Sie, dass Ihre gewöhnen Verfahren zur Identifizierung Endlosschleifen ist 614 00:38:06,810 --> 00:38:08,960 nur das Halten dieser Taste Enter, um sehen, wo Sie nicht weiterkommen. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Es gibt bessere Möglichkeiten, das zu tun, aber jetzt ist das vollkommen ausreichend. 617 00:38:14,780 --> 00:38:17,967 Und stilistisch an Art-konform 50, sollte ich das getan haben. 618 00:38:17,967 --> 00:38:21,550 619 00:38:21,550 --> 00:38:24,030 OK. 620 00:38:24,030 --> 00:38:28,400 >> So einen letzten Befehl, um einzuführen. 621 00:38:28,400 --> 00:38:30,810 Nun, lassen Sie gdb debuggen in. 622 00:38:30,810 --> 00:38:35,580 Also anstatt an Haupt brechen, wenn ich kennen die Funktion foo ist auch die 623 00:38:35,580 --> 00:38:39,230 Problem, dann habe ich konnte einfach sagte, brechen bei foo statt. 624 00:38:39,230 --> 00:38:42,310 Sagen wir, ich brechen an Haupt-und foo. 625 00:38:42,310 --> 00:38:45,390 So können Sie so viele Haltepunkte setzen wie Sie wollen. 626 00:38:45,390 --> 00:38:49,230 Wenn ich schreibe Lauf, es geht an der Haltestelle - 627 00:38:49,230 --> 00:38:52,180 ooh, lassen Sie neu kompilieren, da Ich änderten sich die Dinge. 628 00:38:52,180 --> 00:38:55,950 Sie finden diese Linie, Warnung, Quelle zu sehen Datei neuer ist als ausführbare Datei. 629 00:38:55,950 --> 00:38:59,680 Das heißt also, dass ich gerade hier ging und verändert diese, um Stil entsprechen 630 00:38:59,680 --> 00:39:03,100 50, aber ich habe nicht neu kompilieren das Programm. 631 00:39:03,100 --> 00:39:04,870 So GDB macht mich bewusst. 632 00:39:04,870 --> 00:39:10,130 Ich werde aufhören, machen Debug wieder getroffen gdb debuggen. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> So, jetzt zurück zu dem, was ich tat. 635 00:39:12,800 --> 00:39:15,720 Brechen Haupt-, Pause foo. 636 00:39:15,720 --> 00:39:20,680 Nun, wenn ich das Programm laufen, so ist es geht weiter, bis ein Treffer 637 00:39:20,680 --> 00:39:21,320 Breakpoint. 638 00:39:21,320 --> 00:39:24,680 Das Haltepunkt passiert sei der erste am wichtigsten. 639 00:39:24,680 --> 00:39:28,630 Nun, anstatt das zu tun nächste, nächste, nächste, Weiter, Weiter, bis ich foo, ich 640 00:39:28,630 --> 00:39:35,230 können weiterhin geben, die weiterhin , bis Sie auf den nächsten Haltepunkt. 641 00:39:35,230 --> 00:39:37,200 Ich muss die ganze Zahl zuerst ein. 642 00:39:37,200 --> 00:39:40,570 Weiter wird auch weiterhin, bis ich die nächsten Haltepunkt, was das ist 643 00:39:40,570 --> 00:39:43,320 Funktion foo. 644 00:39:43,320 --> 00:39:50,130 >> So Run laufen, bis Sie auf eine Haltepunkt, aber nur geben, wenn Lauf 645 00:39:50,130 --> 00:39:54,060 Sie beginnen das Programm, und dann, von da an, ist es auch weiterhin. 646 00:39:54,060 --> 00:40:01,950 Wenn ich gerade tat brechen Haupt-und dann lief, wird es bei brechen 647 00:40:01,950 --> 00:40:03,670 Haupt-, und dann weiter. 648 00:40:03,670 --> 00:40:10,050 Da ich nicht über einen Haltepunkt an foo, geben Sie die ganze Zahl ist, dann bin ich jetzt 649 00:40:10,050 --> 00:40:11,380 nicht auf foo zu brechen. 650 00:40:11,380 --> 00:40:16,318 Es ist nur los auf unendlich Schleife, bis dass. 651 00:40:16,318 --> 00:40:17,568 OK. 652 00:40:17,568 --> 00:40:19,500 653 00:40:19,500 --> 00:40:24,420 >> Also das ist, Intro to GDB. 654 00:40:24,420 --> 00:40:27,790 Sie sollten beginnen, es zu benutzen Ihr Problem in Sets. 655 00:40:27,790 --> 00:40:30,550 Es kann sehr hilfreich sein , um Fehler zu identifizieren. 656 00:40:30,550 --> 00:40:35,280 Wenn Sie tatsächlich nur, Zeile für Zeile, gehen durch den Code, und vergleichen, was 657 00:40:35,280 --> 00:40:39,740 tatsächlich geschieht mit dem, was Sie erwarten passieren, dann ist es ziemlich 658 00:40:39,740 --> 00:40:41,060 schwierig, Ihre Fehler zu verpassen. 659 00:40:41,060 --> 00:40:45,280 660 00:40:45,280 --> 00:40:46,530 OK. 661 00:40:46,530 --> 00:40:48,310 662 00:40:48,310 --> 00:40:54,040 >> So letzte Woche David brachte diese Secret-Key-Kryptographie Zeug für die 663 00:40:54,040 --> 00:40:59,350 erste Mal, wo wir nicht wollen, Passwörter einfach auf unsere gespeichert werden 664 00:40:59,350 --> 00:41:03,210 Computer in einigen Nur-Text-Datei, in der kann jemand einfach kommen und über 665 00:41:03,210 --> 00:41:04,660 öffnen Sie es und lesen Sie sie. 666 00:41:04,660 --> 00:41:07,530 Idealerweise würden sie verschlüsselt werden in irgendeiner Weise. 667 00:41:07,530 --> 00:41:13,340 Und Problem Set 2, werden Sie sich mit einem Verfahren zur Verschlüsselung, 668 00:41:13,340 --> 00:41:16,520 oder, na ja, zwei Methoden, aber sie sind nicht so groß. 669 00:41:16,520 --> 00:41:20,050 Wenn Sie die Ausgabe Hacker tun, sind Sie auch gehen, um mit zu tun 670 00:41:20,050 --> 00:41:22,150 Entschlüsseln einige Dinge. 671 00:41:22,150 --> 00:41:29,770 >> Also die Frage ist jetzt, gut, auch wenn wir haben die stärkste Verschlüsselung 672 00:41:29,770 --> 00:41:34,830 Algorithmus in der Welt, wenn Sie ein besonders schlechte vergessen, dann ist es 673 00:41:34,830 --> 00:41:37,720 wird dir nicht helfen sehr viel, da die Menschen noch in der Lage, um es herauszufinden sein. 674 00:41:37,720 --> 00:41:41,530 Auch wenn sehen die verschlüsselten String und es sieht aus wie ein Chaos von Müll 675 00:41:41,530 --> 00:41:44,760 das bedeutet nichts, um sie, wenn sie müssen nur noch ein paar Passwörter ausprobieren 676 00:41:44,760 --> 00:41:50,560 um es herauszufinden, dann sind nicht sehr sicher. 677 00:41:50,560 --> 00:41:55,890 So ein Video ansehen, dass macht diesen Punkt. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [VIDEO PLAYBACK] 680 00:42:00,970 --> 00:42:02,100 >> -Helm, Sie Unhold. 681 00:42:02,100 --> 00:42:03,370 Was ist los? 682 00:42:03,370 --> 00:42:05,170 Was tun Sie, um meine Tochter? 683 00:42:05,170 --> 00:42:09,910 >> -Lassen Sie mich vorstellen die brillante junge plastischen Chirurgen, Dr. Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, die größte Nase Job-Mann in der gesamten 685 00:42:13,730 --> 00:42:16,080 Universum und Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Hoheit. 687 00:42:17,210 --> 00:42:18,070 >> Nose-Job? 688 00:42:18,070 --> 00:42:18,670 Ich verstehe nicht. 689 00:42:18,670 --> 00:42:20,090 Sie ist schon eine Nase Job. 690 00:42:20,090 --> 00:42:21,910 Es war eine süße sechzehn vorhanden. 691 00:42:21,910 --> 00:42:22,140 >> -No. 692 00:42:22,140 --> 00:42:23,690 Es ist nicht das, was Sie denken. 693 00:42:23,690 --> 00:42:25,420 Es ist viel, viel schlimmer. 694 00:42:25,420 --> 00:42:30,300 Wenn Sie mir nicht die Kombination die Luftschild, Dr. Schlotkin wird 695 00:42:30,300 --> 00:42:34,226 geben Sie Ihre Tochter wieder ihre alte Nase. 696 00:42:34,226 --> 00:42:35,476 >> -No. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 Wo hast du das her? 699 00:42:40,516 --> 00:42:41,440 >> -In Ordnung. 700 00:42:41,440 --> 00:42:42,180 Ich werde erzählen. 701 00:42:42,180 --> 00:42:43,381 Ich werde erzählen. 702 00:42:43,381 --> 00:42:44,263 Nein, Papa. 703 00:42:44,263 --> 00:42:45,590 Nein, das darfst du nicht. 704 00:42:45,590 --> 00:42:46,860 >> -Sie sind richtig, meine Liebe. 705 00:42:46,860 --> 00:42:48,450 Ich werde Ihre neue Nase verpassen. 706 00:42:48,450 --> 00:42:52,090 Aber ich werde ihm nicht sagen, die Kombination, egal was. 707 00:42:52,090 --> 00:42:53,680 >> -Sehr gut. 708 00:42:53,680 --> 00:42:55,685 Dr. Schlotkin, mach was du willst. 709 00:42:55,685 --> 00:42:56,914 >> -Mein Vergnügen. 710 00:42:56,914 --> 00:43:00,690 >> [TOOLS geschärft] 711 00:43:00,690 --> 00:43:01,910 >> -No. 712 00:43:01,910 --> 00:43:02,520 Warten. 713 00:43:02,520 --> 00:43:03,836 Warten. 714 00:43:03,836 --> 00:43:05,300 Ich werde erzählen. 715 00:43:05,300 --> 00:43:06,880 Ich werde erzählen. 716 00:43:06,880 --> 00:43:09,130 >> -Ich wusste, dass es funktionieren würde. 717 00:43:09,130 --> 00:43:09,900 Gut. 718 00:43:09,900 --> 00:43:12,850 Gib es mir. 719 00:43:12,850 --> 00:43:16,918 >> -Die Kombination eines. 720 00:43:16,918 --> 00:43:17,406 >> -One. 721 00:43:17,406 --> 00:43:18,382 >> -One. 722 00:43:18,382 --> 00:43:19,358 >> -Two. 723 00:43:19,358 --> 00:43:19,846 >> -Two. 724 00:43:19,846 --> 00:43:20,822 >> -Two. 725 00:43:20,822 --> 00:43:21,310 >> -Drei. 726 00:43:21,310 --> 00:43:21,798 >> -Drei. 727 00:43:21,798 --> 00:43:22,774 >> -Drei. 728 00:43:22,774 --> 00:43:23,262 >> -Four. 729 00:43:23,262 --> 00:43:23,750 >> -Four. 730 00:43:23,750 --> 00:43:26,150 >> -Four. 731 00:43:26,150 --> 00:43:27,010 >> -Five. 732 00:43:27,010 --> 00:43:27,670 >> -Five. 733 00:43:27,670 --> 00:43:29,010 >> -Five. 734 00:43:29,010 --> 00:43:34,770 >> -Also das ist eine Kombination, zwei, drei, vier, fünf. 735 00:43:34,770 --> 00:43:37,460 Das ist die dümmste Kombination Die ich je in meinem Leben gehört. 736 00:43:37,460 --> 00:43:39,710 Das ist die Art von Sache, ein Idiot würde auf seinem Gepäck haben. 737 00:43:39,710 --> 00:43:42,000 >> -Danke, Eure Hoheit. 738 00:43:42,000 --> 00:43:43,530 >> -Was haben Sie getan? 739 00:43:43,530 --> 00:43:44,490 >> -Ich drehte mich von der Wand. 740 00:43:44,490 --> 00:43:45,420 >> -Nein hast du nicht. 741 00:43:45,420 --> 00:43:45,840 Sie schaltete den ganzen Film. 742 00:43:45,840 --> 00:43:46,930 >> -Ich muss den falschen Knopf gedrückt haben. 743 00:43:46,930 --> 00:43:48,265 >> Nun, legte es wieder auf. 744 00:43:48,265 --> 00:43:49,110 Setzen Sie den Film wieder auf. 745 00:43:49,110 --> 00:43:49,510 >> -Ja, Sir. 746 00:43:49,510 --> 00:43:49,917 Ja, Sir. 747 00:43:49,917 --> 00:43:50,324 >> -Gehen wir, Arnold. 748 00:43:50,324 --> 00:43:51,140 Komm, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Natürlich wissen Sie, ich werde noch müssen Sie für diese in Rechnung stellen. 750 00:43:53,060 --> 00:43:53,440 >> [END VIDEO PLAYBACK] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: In Ordnung. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 So, jetzt haben wir schon gesprochen Sicherheit in gewisser Weise schön 754 00:44:08,430 --> 00:44:16,050 kleine Filmplakat, so dass in den letzten Tage, diese Fragen mit der NSA 755 00:44:16,050 --> 00:44:17,300 Überwachung. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Es kann schwierig sein, wie Sie sich fühlen haben eine Art von Privatsphäre in der 758 00:44:26,930 --> 00:44:34,540 Online-Welt, obwohl ich nicht sagen könnte Sie die meisten Details der PRISM. 759 00:44:34,540 --> 00:44:42,130 Also sich jenseits PRISM, werden wir nicht , darüber zu reden, jetzt 760 00:44:42,130 --> 00:44:44,030 denken Sie an Ihren Laptop. 761 00:44:44,030 --> 00:44:48,360 Also hier oben, ich will wechseln zu meinem eigentlichen Konto, 762 00:44:48,360 --> 00:44:50,370 mit meinem kleinen Pinguin. 763 00:44:50,370 --> 00:44:57,310 So habe ich ein Passwort gesetzt, und das vergessen ist, was ich will es sein. 764 00:44:57,310 --> 00:45:02,430 >> Aber denken Sie daran, dass das, was ich die Anmeldung mit, so dass diese Anmeldung 765 00:45:02,430 --> 00:45:04,850 Aufforderung einige Programm. 766 00:45:04,850 --> 00:45:07,910 Es gibt einige Programm, das war durch irgendeine Person geschrieben. 767 00:45:07,910 --> 00:45:13,250 Und so, dass die Person, wenn sie besonders bösartige, konnten sie 768 00:45:13,250 --> 00:45:17,780 gesagt haben, alles in Ordnung, so dass, wenn das Passwort geben, dass ich gleich mein 769 00:45:17,780 --> 00:45:22,800 eigentliche Passwort, oder er ist gleich bis zu einem gewissen speziellen Passwort - 770 00:45:22,800 --> 00:45:25,550 David ist genial oder so etwas - 771 00:45:25,550 --> 00:45:27,190 dann lassen sie in. 772 00:45:27,190 --> 00:45:33,760 So ein böswilliger Programmierer haben könnte Zugriff auf alle Ihre Macs oder 773 00:45:33,760 --> 00:45:36,150 Windows oder nichts. 774 00:45:36,150 --> 00:45:41,980 >> Das ist also nicht viel von einer Besorgnis, da, Ich meine, das ist Anmeldeprogramm 775 00:45:41,980 --> 00:45:48,720 das ist mit OS X, hunderte ausgeliefert oder Tausende von Menschen haben 776 00:45:48,720 --> 00:45:50,020 überprüft den Code. 777 00:45:50,020 --> 00:45:55,330 Und so, wenn irgendwo im Code, die Sie sagen, wenn diese Zeichenfolge entspricht Gleichen 778 00:45:55,330 --> 00:45:58,860 David ist genial, Login, dann jemand ist sein wird, wie, warten. 779 00:45:58,860 --> 00:45:59,800 Das ist nicht richtig. 780 00:45:59,800 --> 00:46:01,790 Dies sollte nicht hier sein. 781 00:46:01,790 --> 00:46:06,650 Also das ist eine Art, wie wir die Dinge zu Art sicher sein. 782 00:46:06,650 --> 00:46:10,300 >> Aber auch über Programme nachdenken dass Sie schreiben. 783 00:46:10,300 --> 00:46:13,000 Nehmen wir an, Sie die Login-Programm geschrieben hat. 784 00:46:13,000 --> 00:46:20,440 Also das Login-Programm, das Sie geschrieben haben, so offensichtlich, eine gut sind Sie 785 00:46:20,440 --> 00:46:21,210 Programmierer. 786 00:46:21,210 --> 00:46:25,610 Du wirst doch nicht jede böswillige zu setzen wenn x gleich gleich David ist genial 787 00:46:25,610 --> 00:46:27,860 in den Code. 788 00:46:27,860 --> 00:46:31,930 Aber dieses Programm, was Sie tun verwenden, um dieses Programm zu kompilieren? 789 00:46:31,930 --> 00:46:34,180 So etwas wie Schall. 790 00:46:34,180 --> 00:46:38,460 So was, wenn die Person, die passiert schreiben Clang Sonder in Clang verrohrten 791 00:46:38,460 --> 00:46:44,310 so etwas wie, wenn ich die Zusammenstellung loggen Programm, dann geben Sie diesen Code 792 00:46:44,310 --> 00:46:49,720 in das Login-Programm, das sagt, wenn x gleich gleich David ist genial? 793 00:46:49,720 --> 00:46:59,890 Also noch nicht ganz, aber wir haben die gleiche Ausgabe hier, wo Clang, gut, 794 00:46:59,890 --> 00:47:03,790 Tausende, wenn nicht Zehntausende Menschen haben bei Clang sah, haben 795 00:47:03,790 --> 00:47:07,160 sah ihre Code-Zeilen und sagte: alles in Ordnung, es ist nichts schlecht hier. 796 00:47:07,160 --> 00:47:10,680 Offensichtlich ist niemand tun alles, was diese bösartige. 797 00:47:10,680 --> 00:47:15,780 >> Aber was wird sich Klang, wie, was, wenn ich kompilieren Clang? 798 00:47:15,780 --> 00:47:20,900 Was ist, wenn ich etwas Compiler, Clang kompiliert, die in Clang Einsätze 799 00:47:20,900 --> 00:47:25,610 diese spezielle Hack, der sagt, alles in Ordnung, wenn ich kompilieren Clang, dann die 800 00:47:25,610 --> 00:47:31,290 ausführbare bekomme ich speziell schauen sollte Innenseite der Anmeldeprogramm und Einsatz 801 00:47:31,290 --> 00:47:34,230 dieses Passwort, gleich equals Dave ist genial? 802 00:47:34,230 --> 00:47:37,990 Also denken Sie daran, dass Ihr Compiler selbst muss zu einem bestimmten Zeitpunkt erstellt werden. 803 00:47:37,990 --> 00:47:42,810 Also, wenn das, was Sie wählen, um Clang kompilieren mit, selbst bösartig, dann sind Sie 804 00:47:42,810 --> 00:47:45,580 könnte die gesamte aufgeschraubt werden Weg auf der ganzen Linie. 805 00:47:45,580 --> 00:47:49,630 >> So, hier haben wir Ken Thompson und Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 Also das ist eine ikonische Foto. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie ist auf der rechten Seite. 808 00:47:55,470 --> 00:47:58,740 Er ist ein wichtiger - 809 00:47:58,740 --> 00:48:03,640 ziemlich schrieb C. So kann man danke ihm für diese Klasse. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson ist auf der linken Seite. 811 00:48:04,840 --> 00:48:07,780 Die zwei von ihnen im Grunde schrieb UNIX. 812 00:48:07,780 --> 00:48:10,140 Nun, die Hauptursachen waren sie in UNIX. 813 00:48:10,140 --> 00:48:11,310 Es gab einige andere. 814 00:48:11,310 --> 00:48:16,240 So Ken Thompson, an einem gewissen Punkt, gewinnt er den Turing Award. 815 00:48:16,240 --> 00:48:20,860 Und der Turing Award, habe ich immer gehört habe das so referenziert, ist es das 816 00:48:20,860 --> 00:48:23,100 Nobelpreis der Informatik. 817 00:48:23,100 --> 00:48:27,500 >> Also an der Turing Award, hat er geben seiner Dankesrede. 818 00:48:27,500 --> 00:48:31,790 Und er gibt diesem sehr berühmten Rede Jetzt, Reflections on Trusting genannt 819 00:48:31,790 --> 00:48:35,620 Trust, die wir verlinkt haben Um auf der Kurs-Website. 820 00:48:35,620 --> 00:48:41,670 Und in dieser Rede, sagt er, alles in Ordnung, so schrieb ich UNIX, und jetzt alle 821 00:48:41,670 --> 00:48:43,320 Sie sind Menschen mit UNIX. 822 00:48:43,320 --> 00:48:46,960 Nun, denken Sie daran, dass Linux heute ein direkter Nachkomme von UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X direkt verwendet UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows-nicht so sehr, aber eine Menge Ideen wurden von UNIX übernommen. 825 00:48:53,810 --> 00:48:59,220 >> So geht er auf die Bühne und sagt: gut, ich schrieb UNIX. 826 00:48:59,220 --> 00:49:03,940 Und damit Sie wissen, Jungs, ich bin der Lage, in jeder Anmeldung 827 00:49:03,940 --> 00:49:05,590 Einzel einer der Computer. 828 00:49:05,590 --> 00:49:14,280 Da habe ich eine dieser speziellen, wenn x gleich gleich Ken Thomson ist genial, 829 00:49:14,280 --> 00:49:16,350 dann darf ich dich einloggen. 830 00:49:16,350 --> 00:49:18,370 So können die Leute sind wie, na ja, wie hast du das gemacht? 831 00:49:18,370 --> 00:49:21,090 Wir sahen uns das Login-Programm und nichts ist da. 832 00:49:21,090 --> 00:49:24,700 Er ist wie, nun ja, modifizierte ich die Compiler in der Login-Programm anmelden 833 00:49:24,700 --> 00:49:30,490 so dass die Anmeldeprogramm jetzt haben dass x gleich gleich Ken Thompson 834 00:49:30,490 --> 00:49:31,700 ist genial. 835 00:49:31,700 --> 00:49:33,120 >> Und sie sagen, gut, das ist nicht wahr. 836 00:49:33,120 --> 00:49:35,740 Wir sind an der Compiler suchen, und die Compiler keine Linien haben 837 00:49:35,740 --> 00:49:36,400 Code so. 838 00:49:36,400 --> 00:49:40,540 Er ist wie, OK, aber was sind Sie Zusammenstellung der Compiler mit? 839 00:49:40,540 --> 00:49:44,810 Und sie denken, und er ist, wie, na ja, Ich bin derjenige, der Compiler gab 840 00:49:44,810 --> 00:49:50,580 Sie verwenden, um den Compiler zu kompilieren, so Sie kompilieren einen Compiler, dass 841 00:49:50,580 --> 00:49:56,390 selbst ist bösartig, und wird brechen die Login-Programm. 842 00:49:56,390 --> 00:49:59,360 Also im Grunde, an diesem Punkt gibt es keine Möglichkeit, Sie könnten an der Quelle zu sehen 843 00:49:59,360 --> 00:50:02,450 Code des Login-Programm um zu sehen, was falsch ist. 844 00:50:02,450 --> 00:50:04,220 Sie konnte sich nicht einmal in der Suche Quellcode des Compilers 845 00:50:04,220 --> 00:50:06,790 um zu sehen, was falsch ist. 846 00:50:06,790 --> 00:50:11,940 >> Sie müssten, um an der Maschine zu suchen Code, der für die tatsächliche binäre 847 00:50:11,940 --> 00:50:16,760 Compiler kompiliert, um zu sehen, warten Sie, diese Zeilen Code sollte nicht hier sein. 848 00:50:16,760 --> 00:50:22,130 Aber Ken Thompson nahm es einen Schritt weiter und sagte, gut, es gibt 849 00:50:22,130 --> 00:50:25,980 diese speziellen Programme, die tatsächlich Ihnen helfen, die binäre Programme zu lesen, 850 00:50:25,980 --> 00:50:29,340 und so, wenn jemand das Programm verwendet, um lesen Sie die binäre, würden sie diese sehen 851 00:50:29,340 --> 00:50:30,490 Codezeilen. 852 00:50:30,490 --> 00:50:34,020 Er modifizierte diese Programme zu sagen, alle richtig, wenn Sie auf der Suche sind 853 00:50:34,020 --> 00:50:38,460 Compiler, nicht diese besondere zeigen Satz binärer. 854 00:50:38,460 --> 00:50:42,830 >> Also dann müssen Sie nehmen, dass ein Schritt weiter und im Grunde, dass haben könnte 855 00:50:42,830 --> 00:50:46,210 genommen mehrere Dereferenzierungsebenen, und irgendwann, ist niemand wirklich 856 00:50:46,210 --> 00:50:47,990 gehen zu überprüfen. 857 00:50:47,990 --> 00:50:52,590 So ist die Moral von der Geschichte ist, sind Sie nicht zu sein Schreiben 858 00:50:52,590 --> 00:50:54,340 Klang in dieser Klasse. 859 00:50:54,340 --> 00:50:57,020 Du gehst zu sein mit Kletter Klang viel in dieser Klasse. 860 00:50:57,020 --> 00:51:00,490 Für alles, was Sie wissen, ist eine bösartige Clang Programm, das sabotiert wird jedes 861 00:51:00,490 --> 00:51:03,520 einzigen Programm, das Sie jemals zusammengestellt haben. 862 00:51:03,520 --> 00:51:08,206 Und um Ihnen auf diesem sehr ominösen verlassen beachten Sie, sehen Sie, am Mittwoch. 863 00:51:08,206 --> 00:51:10,030 >> [Applaus] 864 00:51:10,030 --> 00:51:12,935 >> Sprecher 2: Bei der nächsten CS50. 865 00:51:12,935 --> 00:51:14,580 >> SPEAKER 3: Wagen Sie es nicht sagen. 866 00:51:14,580 --> 00:51:15,930 Sie können dies tun. 867 00:51:15,930 --> 00:51:19,440 Sie habe das schon getan haben, können Sie dies tun heute, können Sie dies morgen tun. 868 00:51:19,440 --> 00:51:20,930 Sie machen das schon seit Jahren. 869 00:51:20,930 --> 00:51:22,790 Gehen Sie einfach da und tun. 870 00:51:22,790 --> 00:51:24,310 Sie können dies tun. 871 00:51:24,310 --> 00:51:26,102 >> [MUSIC SPIEL]