>> ΟΜΙΛΗΤΗΣ 1: Ας γράψουμε ένα πρόγραμμα που παίρνει ένα string από τον χρήστη χωρίς
χρησιμοποιώντας το CS50 Βιβλιοθήκης λειτουργούν GetString.
Για να το κάνετε αυτό, θα προχωρήσει και η χρήση scanf, η λειτουργία η GetString
συνάρτηση χρησιμοποιεί στην πραγματικότητα κάτω από το καπό.
Αλλά Πάω να το κάνετε αυτό σκόπιμα με τρόπο προβληματικό.
Πάω να κάνουμε με έναν τρόπο που πιστεύω ότι θα ήταν σωστό, αλλά αποδεικνύεται ότι
μου υπόθεση πρόκειται να είναι αρκετά, είναι αρκετά προβληματική.
Και στην πραγματικότητα, είναι αρκετά επικίνδυνο.
Επειδή σφάλματα, όπως εκείνο που είμαι έτοιμος να κάνουν μπορεί να αξιοποιηθεί από τους αντιπάλους
όπως ότι το μηχάνημά σας ή το πρόγραμμά σας μπορεί να αναλάβει ενδεχομένως.
>> Ας αρχίσει ως εξής.
Πρώτα ας κηρύξει σειρά μας, αλλιώς γνωστή σήμερα ως ένα αστέρι char,
και να το ονομάσουμε s.
Αφήνει την επόμενη ζητήσει από το χρήστη για ένα string, όπως με το "κορδόνι παρακαλώ." Και
ας πάρει τώρα το κορδόνι από το χρήστη χρησιμοποιώντας scanf, παραθέτω χωρίς εισαγωγικά, "% s." Σε
Με άλλα λόγια, ας ενημερώσει scanf ότι εμείς όντως περιμένετε να πάρετε ένα string
από το χρήστη.
>> Αλλά τώρα πρέπει να πω scanf ένα άλλο πράγμα -
πού να βάλει το string που ο χρήστης παρέχει.
Λοιπόν, είμαι πρόκειται να ξεκινήσει πολύ απλά με κόμμα s, διευκρινίζοντας ότι θα ήθελα
scanf να βάλει εκεί το string.
Είμαι δίπλα πρόκειται να εκτυπώσετε κάτι όπως printf "thanks for the% s
backslash n κόμμα. "Και όπως πάντα, είμαι πρόκειται να περάσει στη συμβολοσειρά, s.
Τώρα, ας σώσει, μεταγλώττιση, και να τρέξει αυτό προγράμματος, και να δούμε αν μπορούμε να μην μπορεί να προκαλέσει
το πρόβλημα είχα προβλέψει.
>> Κάντε scanf-1.
./scanf-1.
String παρακαλώ.
Ας παρέχουν κάτι σαν, "γεια". "Ευχαριστώ για το null." Χμμ, αυτό δεν είναι
ό, τι περίμενα.
Λοιπόν, τι συμβαίνει εδώ;
>> Λοιπόν, αποδεικνύεται γιατί δηλώσαμε s ως ​​ένα αστέρι char, αλλά δεν το κάναμε
στην πραγματικότητα είναι αποθηκευμένα σε s τη διεύθυνση ενός πραγματικό κομμάτι της μνήμης, scanf δεν έκανε
έχουν πουθενά να βάλει το string ότι ο χρήστης πληκτρολογήσει μέσα
Πράγματι, αν ο χρήστης ήταν τώρα πληκτρολογήσετε πολύ περισσότερο από ό, τι σειρά "γεια"
για παράδειγμα αρκετές γραμμές κειμένου ή αρκετά σημεία του κειμένου, είναι αρκετά
πιθανό ότι θα μπορούσε να προκαλέσει μια λεγόμενη κατάτμηση της βλάβης.
>> Επειδή η scanf δεν πρόκειται να γνωρίζουν ότι Δεν έχω πραγματικά να θέσει μια διεύθυνση
εσωτερικό του s.
Μάλλον, πρόκειται να δούμε κάποια αξία σε s, κάποιο μοντέλο των bits που μπορεί να
πολύ καλά να είναι μια τιμή σκουπίδια, υπάρχει μόνο κατά τύχη.
Και scanf είναι ακόμα πρόκειται να προσπαθήσω να γράψω το string του χρήστη σε αυτή τη διεύθυνση,
ακόμη και αν αυτό είναι μια τιμή σκουπίδια, τα οποία θα μπορούσε πράγματι να προκαλέσει μια συντριβή.
>> Λοιπόν, πώς θα πάμε να το διορθώσω αυτό;