1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> DAVID J. MALAN: Έτσι αποδεικνύεται ότι αντιγράφοντας μια σειρά δεν είναι τόσο 3 00:00:03,130 --> 00:00:05,750 απλή όσο η αντιγραφή μια πρωτόγονη, σαν int ή float. 4 00:00:05,750 --> 00:00:09,190 Μετά από όλα, κάτω από το καπό μια συμβολοσειρά είναι μια ακολουθία χαρακτήρων. 5 00:00:09,190 --> 00:00:13,130 Έτσι, αντιγράφοντας μια σειρά, ως εκ τούτου, πρέπει να συνεπάγεται ότι η αντιγραφή όλης της σειράς των 6 00:00:13,130 --> 00:00:14,240 χαρακτήρων. 7 00:00:14,240 --> 00:00:17,470 >> Ας στρέψουμε την προσοχή μας πίσω σε αυτό τελευταίας εφαρμογής και rip έξω αυτό 8 00:00:17,470 --> 00:00:21,470 γραμμή, string t ισούται με s, η οποία προφανώς δεν ήταν επαρκής. 9 00:00:21,470 --> 00:00:24,440 Ας το αντικαταστήσει με μια γραμμή που Φαίνεται, αντίθετα, σαν αυτό. 10 00:00:24,440 --> 00:00:34,020 String t παίρνει malloc μήκους σειρά s συν 1 φορές το μέγεθος ενός χαρακτήρα. 11 00:00:34,020 --> 00:00:36,320 >> Τώρα υπάρχει απόσπασμα λίγο θα σε σε αυτή τη γραμμή κώδικα. 12 00:00:36,320 --> 00:00:39,330 Πρώτον, malloc, μικρή για τη μνήμη κατανομής, και το 13 00:00:39,330 --> 00:00:40,700 λειτουργία κάνει ακριβώς αυτό. 14 00:00:40,700 --> 00:00:44,740 Δεδομένου ακέραιος, επιστρέφει για να σας το διεύθυνση του ένα μεγάλο κομμάτι της μνήμης 15 00:00:44,740 --> 00:00:45,960 ότι πολλά bytes. 16 00:00:45,960 --> 00:00:50,090 Εν τω μεταξύ, το μήκος των χορδών s συν 1 έχει ως στόχο να δείξουμε ότι θέλουμε ως 17 00:00:50,090 --> 00:00:54,690 πολλά bytes ως s κατέχει ήδη, συμπεριλαμβανομένων των μηδενικών τερματισμού της, η 18 00:00:54,690 --> 00:00:57,050 backslash 0 στο τέλος μιας συμβολοσειράς. 19 00:00:57,050 --> 00:01:00,170 >> Εν τω μεταξύ, δεν θέλω οπωσδήποτε να θυμάστε πόσο μεγάλο θα είναι το char είναι, ακόμη και 20 00:01:00,170 --> 00:01:04,340 αν και στα περισσότερα συστήματα είναι απλά 1 byte, οπότε θα καλέσω το μέγεθος του χαρακτήρα και να 21 00:01:04,340 --> 00:01:08,210 καταλάβω πόσο μεγάλο δυναμικά ένα άτομο χαρακτήρας είναι. 22 00:01:08,210 --> 00:01:12,550 Μόλις πολλαπλασιάζονται μαζί, να πάρω πίσω το συνολικός αριθμός των bytes που χρειάζομαι. 23 00:01:12,550 --> 00:01:14,680 >> Αλλά τι θα γινόταν αν malloc αποτύχει να επιστρέφει τη μνήμη χρειαζόμαστε; 24 00:01:14,680 --> 00:01:16,730 Θα ελέγχετε καλύτερα γι 'αυτό ως ακολούθως. 25 00:01:16,730 --> 00:01:23,330 Αν t ισούται με μηδέν, τότε είμαι πρώτα θα στην ελεύθερη s, η μνήμη επιστρέφει με get 26 00:01:23,330 --> 00:01:27,120 string, και μετά θα πάω να επιστροφή 1, να δηλώσει σφάλμα. 27 00:01:27,120 --> 00:01:30,360 >> Αλλά αν όλα είναι καλά, θα πάω να προχωρήσει να χρησιμοποιήσετε ένα βρόχο και τέσσερις επαναλήψεις 28 00:01:30,360 --> 00:01:31,110 ως ακολούθως. 29 00:01:31,110 --> 00:01:36,000 Για int i πάρει 0, n ισούται το μήκος της συμβολοσειράς s. 30 00:01:36,000 --> 00:01:40,350 Πάω να το κάνετε αυτό, εφόσον i είναι μικρότερη ή ίση προς n έτσι ώστε να μπορώ 31 00:01:40,350 --> 00:01:44,460 επαναλήψεις μέσα από και συμπεριλαμβανομένης της null χαρακτήρα που καταλήγει σε s. 32 00:01:44,460 --> 00:01:47,450 >> Και σε κάθε επανάληψη, είμαι πρόκειται να αυξήσετε i. 33 00:01:47,450 --> 00:01:52,496 Εν τω μεταξύ, στο εσωτερικό αυτού του βρόχου, αντιγραφή s i-ου χαρακτήρα σε t i-th 34 00:01:52,496 --> 00:01:59,310 θέση, αρκεί να κάνουμε t βραχίονα i παίρνει s βραχίονα i. 41 00:01:59,320 --> 00:02:02,750 >> Ας σώσει τώρα, την κατάρτιση, και εκτελέσετε αυτό το νέο πρόγραμμα. 42 00:02:02,750 --> 00:02:06,690 Κάντε ένα αντίγραφο 1 dot κάθετο αντίγραφο 1. 43 00:02:06,690 --> 00:02:09,460 Και θα πω κάτι σαν γεια σε όλα τα πεζά. 44 00:02:09,460 --> 00:02:12,280 Και ευτυχώς, αυτή τη φορά μου πρωτότυπο παραμένει αμετάβλητη. 45 00:02:12,280 --> 00:02:13,660 γεια σε όλα τα πεζά. 46 00:02:13,660 --> 00:02:15,540 Αλλά το αντίγραφο είναι, πράγματι, κεφαλαιοποιούνται. 47 00:02:37,120 --> 00:02:38,963