1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> DAVID J. MALAN: So stellt sich heraus, dass Kopieren einer Zeichenfolge ist nicht annähernd so 3 00:00:03,130 --> 00:00:05,750 einfach wie das Kopieren einer primitiven, wie ein int oder float. 4 00:00:05,750 --> 00:00:09,190 Denn unter der Haube ein String ist ein Zeichen-Sequenz. 5 00:00:09,190 --> 00:00:13,130 So Kopieren einer Zeichenfolge, muss daher dass das Kopieren von ganzen Abfolge von 6 00:00:13,130 --> 00:00:14,240 Zeichen. 7 00:00:14,240 --> 00:00:17,470 >> Wenden wir unsere Aufmerksamkeit wieder auf, dass zuletzt Umsetzung und zerreißen diese 8 00:00:17,470 --> 00:00:21,470 Linie, string s t gleich, was offensichtlich nicht ausreichend war. 9 00:00:21,470 --> 00:00:24,440 Lassen Sie ersetzen es durch eine Linie, die aussieht, sondern wie diese. 10 00:00:24,440 --> 00:00:34,020 String t bekommt malloc der String-Länge s + 1 mal die Größe eines Zeichens. 11 00:00:34,020 --> 00:00:36,320 >> Jetzt gibt es ein bisschen gehen Zitat in diesem Codezeile. 12 00:00:36,320 --> 00:00:39,330 Erstens, malloc, kurz für Speicher Zuordnung und 13 00:00:39,330 --> 00:00:40,700 Funktion tut genau dies. 14 00:00:40,700 --> 00:00:44,740 Da eine ganze Zahl, die zu Ihnen gibt sie Adresse eines Teil des Speichers der 15 00:00:44,740 --> 00:00:45,960 dass viele Bytes. 16 00:00:45,960 --> 00:00:50,090 Inzwischen hat die String-Länge von s plus 1 soll andeuten, dass wir möchten, wie 17 00:00:50,090 --> 00:00:54,690 viele Bytes als s bereits einnimmt, einschließlich der Null-Terminator, den 18 00:00:54,690 --> 00:00:57,050 Backslash 0 am Ende einer Zeichenkette. 19 00:00:57,050 --> 00:01:00,170 >> Inzwischen glaube ich nicht unbedingt daran erinnern, wie groß ein Zeichen ist, auch 20 00:01:00,170 --> 00:01:04,340 obwohl auf den meisten Systemen ist es einfach ein Byte, also werde ich Größe der Zeichen zu rufen 21 00:01:04,340 --> 00:01:08,210 herauszufinden, dynamisch, wie groß ein individueller Charakter ist. 22 00:01:08,210 --> 00:01:12,550 Sobald miteinander multipliziert, bekomme ich wieder die Gesamtzahl der Bytes, die ich brauche. 23 00:01:12,550 --> 00:01:14,680 >> Aber was, wenn malloc nicht zu Rückkehr der Erinnerung, die wir brauchen? 24 00:01:14,680 --> 00:01:16,730 Ich würde am besten überprüfen, dass wie folgt. 25 00:01:16,730 --> 00:01:23,330 Wenn t gleich null ist, dann bin ich zum ersten Mal gehen freie s, der Speicher von get zurück 26 00:01:23,330 --> 00:01:27,120 Schnur, und dann werde ich 1 zurück, um Fehler zu bedeuten. 27 00:01:27,120 --> 00:01:30,360 >> Aber wenn alles gut geht, werde ich gehen um ein vier-Schleife durchlaufen und 28 00:01:30,360 --> 00:01:31,110 wie folgt. 29 00:01:31,110 --> 00:01:36,000 Für int i erhalten 0, n equals der String-Länge von s. 30 00:01:36,000 --> 00:01:40,350 Ich werde das so lange, wie ich zu tun ist weniger als oder gleich n ist, so dass ich 31 00:01:40,350 --> 00:01:44,460 laufen bis bis einschließlich der Nullabschlusszeichen in s. 32 00:01:44,460 --> 00:01:47,450 >> Und bei jeder Iteration, ich bin werde ich erhöhen. 33 00:01:47,450 --> 00:01:52,496 Inzwischen innerhalb dieser Schleife, kopieren s i-te Zeichen in t i-ten 34 00:01:52,496 --> 00:01:59,310 Stelle genügt es, t tun Halterung i s bekommt Halterung i. 41 00:01:59,320 --> 00:02:02,750 >> Lassen Sie uns jetzt noch retten, kompilieren und führen Sie dieses neue Programm. 42 00:02:02,750 --> 00:02:06,690 Machen Kopie 1 Punkt Strich Kopie ein. 43 00:02:06,690 --> 00:02:09,460 Und ich werde etwas sagen wie hallo in Kleinbuchstaben. 44 00:02:09,460 --> 00:02:12,280 Und Gott sei Dank, diesmal meine Original bleibt unverändert. 45 00:02:12,280 --> 00:02:13,660 hallo in Kleinbuchstaben. 46 00:02:13,660 --> 00:02:15,540 Aber die Kopie ist in der Tat aktiviert. 47 00:02:37,120 --> 00:02:38,963