1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> ΟΜΙΛΗΤΗΣ 1: Ας γράψουμε ένα πρόγραμμα που παίρνει ένα string από τον χρήστη χωρίς 3 00:00:02,920 --> 00:00:05,700 χρησιμοποιώντας το CS50 Βιβλιοθήκης λειτουργούν GetString. 4 00:00:05,700 --> 00:00:08,720 Για να το κάνετε αυτό, θα προχωρήσει και η χρήση scanf, η λειτουργία η GetString 5 00:00:08,720 --> 00:00:10,950 συνάρτηση χρησιμοποιεί στην πραγματικότητα κάτω από το καπό. 6 00:00:10,950 --> 00:00:13,780 Αλλά Πάω να το κάνετε αυτό σκόπιμα με τρόπο προβληματικό. 7 00:00:13,780 --> 00:00:17,230 Πάω να κάνουμε με έναν τρόπο που πιστεύω ότι θα ήταν σωστό, αλλά αποδεικνύεται ότι 8 00:00:17,230 --> 00:00:19,380 μου υπόθεση πρόκειται να είναι αρκετά, είναι αρκετά προβληματική. 9 00:00:19,380 --> 00:00:20,800 Και στην πραγματικότητα, είναι αρκετά επικίνδυνο. 10 00:00:20,800 --> 00:00:24,750 Επειδή σφάλματα, όπως εκείνο που είμαι έτοιμος να κάνουν μπορεί να αξιοποιηθεί από τους αντιπάλους 11 00:00:24,750 --> 00:00:28,870 όπως ότι το μηχάνημά σας ή το πρόγραμμά σας μπορεί να αναλάβει ενδεχομένως. 12 00:00:28,870 --> 00:00:30,200 >> Ας αρχίσει ως εξής. 13 00:00:30,200 --> 00:00:33,540 Πρώτα ας κηρύξει σειρά μας, αλλιώς γνωστή σήμερα ως ένα αστέρι char, 14 00:00:33,540 --> 00:00:34,750 και να το ονομάσουμε s. 15 00:00:34,750 --> 00:00:39,400 Αφήνει την επόμενη ζητήσει από το χρήστη για ένα string, όπως με το "κορδόνι παρακαλώ." Και 16 00:00:39,400 --> 00:00:44,250 ας πάρει τώρα το κορδόνι από το χρήστη χρησιμοποιώντας scanf, παραθέτω χωρίς εισαγωγικά, "% s." Σε 17 00:00:44,250 --> 00:00:47,760 Με άλλα λόγια, ας ενημερώσει scanf ότι εμείς όντως περιμένετε να πάρετε ένα string 18 00:00:47,760 --> 00:00:48,630 από το χρήστη. 19 00:00:48,630 --> 00:00:50,810 >> Αλλά τώρα πρέπει να πω scanf ένα άλλο πράγμα - 20 00:00:50,810 --> 00:00:53,350 πού να βάλει το string που ο χρήστης παρέχει. 21 00:00:53,350 --> 00:00:57,840 Λοιπόν, είμαι πρόκειται να ξεκινήσει πολύ απλά με κόμμα s, διευκρινίζοντας ότι θα ήθελα 22 00:00:57,840 --> 00:00:59,320 scanf να βάλει εκεί το string. 23 00:00:59,320 --> 00:01:04,818 Είμαι δίπλα πρόκειται να εκτυπώσετε κάτι όπως printf "thanks for the% s 24 00:01:04,818 --> 00:01:10,670 backslash n κόμμα. "Και όπως πάντα, είμαι πρόκειται να περάσει στη συμβολοσειρά, s. 25 00:01:10,670 --> 00:01:14,920 Τώρα, ας σώσει, μεταγλώττιση, και να τρέξει αυτό προγράμματος, και να δούμε αν μπορούμε να μην μπορεί να προκαλέσει 26 00:01:14,920 --> 00:01:16,590 το πρόβλημα είχα προβλέψει. 27 00:01:16,590 --> 00:01:18,650 >> Κάντε scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String παρακαλώ. 30 00:01:21,830 --> 00:01:25,540 Ας παρέχουν κάτι σαν, "γεια". "Ευχαριστώ για το null." Χμμ, αυτό δεν είναι 31 00:01:25,540 --> 00:01:26,750 ό, τι περίμενα. 32 00:01:26,750 --> 00:01:28,240 Λοιπόν, τι συμβαίνει εδώ; 33 00:01:28,240 --> 00:01:32,040 >> Λοιπόν, αποδεικνύεται γιατί δηλώσαμε s ως ​​ένα αστέρι char, αλλά δεν το κάναμε 34 00:01:32,040 --> 00:01:36,120 στην πραγματικότητα είναι αποθηκευμένα σε s τη διεύθυνση ενός πραγματικό κομμάτι της μνήμης, scanf δεν έκανε 35 00:01:36,120 --> 00:01:38,940 έχουν πουθενά να βάλει το string ότι ο χρήστης πληκτρολογήσει μέσα 36 00:01:38,940 --> 00:01:42,510 Πράγματι, αν ο χρήστης ήταν τώρα πληκτρολογήσετε πολύ περισσότερο από ό, τι σειρά "γεια" 37 00:01:42,510 --> 00:01:46,780 για παράδειγμα αρκετές γραμμές κειμένου ή αρκετά σημεία του κειμένου, είναι αρκετά 38 00:01:46,780 --> 00:01:50,280 πιθανό ότι θα μπορούσε να προκαλέσει μια λεγόμενη κατάτμηση της βλάβης. 39 00:01:50,280 --> 00:01:53,570 >> Επειδή η scanf δεν πρόκειται να γνωρίζουν ότι Δεν έχω πραγματικά να θέσει μια διεύθυνση 40 00:01:53,570 --> 00:01:54,610 εσωτερικό του s. 41 00:01:54,610 --> 00:01:58,000 Μάλλον, πρόκειται να δούμε κάποια αξία σε s, κάποιο μοντέλο των bits που μπορεί να 42 00:01:58,000 --> 00:02:00,910 πολύ καλά να είναι μια τιμή σκουπίδια, υπάρχει μόνο κατά τύχη. 43 00:02:00,910 --> 00:02:04,600 Και scanf είναι ακόμα πρόκειται να προσπαθήσω να γράψω το string του χρήστη σε αυτή τη διεύθυνση, 44 00:02:04,600 --> 00:02:08,789 ακόμη και αν αυτό είναι μια τιμή σκουπίδια, τα οποία θα μπορούσε πράγματι να προκαλέσει μια συντριβή. 45 00:02:08,789 --> 00:02:10,130 >> Λοιπόν, πώς θα πάμε να το διορθώσω αυτό; 46 00:02:10,130 --> 00:02:12,523