[Παίζει μουσική] ROB BODEN: Εντάξει. Έτσι, το πρώτο πράγμα πρώτα, βίντεο από ένα γνωστό πρόσωπο. [VIDEO PLAYBACK] -Εντάξει. Αυτό είναι CS50, και αυτό είναι η έναρξη των τριών εβδομάδων. Λυπάμαι που δεν θα μπορούσε να είναι εκεί μαζί σας σήμερα, αλλά επιτρέψτε μου να εισαγάγει CS50 δικό Rob Boden. [ΤΕΛΟΣ VIDEO PLAYBACK] [Χειροκρότημα και ζητωκραυγές] ROB BODEN: Η φιλμογραφία στην ότι το βίντεο είναι φανταστικό. Εντάξει. Έτσι, η πρώτη, υπάρχει ένα άλλο γεύμα. Είναι αύριο στις 1:15. Δεν υπάρχει καμία γεύμα αυτή την Παρασκευή. Είναι με Quora. Και Tommy δεν είναι εδώ ακόμα, αλλά ένα από τα οι άνθρωποι είναι πρώην CF κεφάλι, Tommy McWilliam. Έτσι, αυτός είναι ένας διασκεδαστικός τύπος. Πρέπει να έρθεις. Εντάξει. Έτσι, την περασμένη εβδομάδα, αρχίσαμε να σπάσει χώρια για το τι ένα string είναι πραγματικά. Έχουμε γνωστό από την αρχή ότι είναι μια ακολουθία χαρακτήρων. Αλλά την περασμένη εβδομάδα, έχουμε Βυθίστηκα στο γεγονός ότι αυτό είναι πραγματικά μια αλληλουχία χαρακτήρες, καλά, τώρα έχουμε συστοιχίες των χαρακτήρων. Και γνωρίζουμε ότι μια σειρά, είναι μια σειρά των χαρακτήρων, στο τέλος, έχουμε αυτή την ειδική null byte, αυτό backslash 0, που δείχνει το τέλος της το string. Και έτσι ένα string είναι μια σειρά από χαρακτήρες, αλλά μπορούμε να έχουμε περισσότερα από απλά μια σειρά από χαρακτήρες, μπορούμε να έχουμε μια σειρά από κάθε είδος των πράγμα που θέλουμε. Έτσι, αν θυμάστε από την προηγούμενη εβδομάδα, η Ηλικίες πρόγραμμα που εισήγαγε David πολύ γρήγορα. Έτσι το πρώτο πράγμα που θα πάμε να κάνουμε είναι να να ζητήσει από το χρήστη έναν ακέραιο, η αριθμός των ατόμων στο δωμάτιο. Μόλις έχουμε αυτό το ακέραιο, είμαστε δηλώνοντας μια σειρά. Παρατηρήστε τη σύνταξη αυτή βραχίονα. Θα πάμε να το συνηθίσεις. Έτσι είμαστε δηλώνοντας μια σειρά ακεραίων κάλεσε τις ηλικίες, και υπάρχουν n ακέραιοι σε αυτό το φάσμα. Έτσι, αυτό το σχέδιο εδώ, αυτό το 4 int θ ισούται με μηδέν, το i είναι μικρότερο από n, i συν plus, που είναι, επίσης, πρόκειται να είναι ένα πρότυπο ότι έχετε πολύ παλιά. Επειδή αυτό είναι λίγο πολύ το πώς είστε πάντα θα μετακινηθείτε πάνω από συστοιχίες. Έτσι, να θυμάστε ότι n είναι ο το μήκος του πίνακα μας. Και έτσι εδώ, είμαστε κατ 'επανάληψη για την ηλικία του ατόμου i στο δωμάτιο. Μετά από αυτό, πάμε προς τα κάτω, και για ό, τι αυθαίρετο λόγο, εμείς, στη συνέχεια, εκτυπώσετε πόσο χρονών θα πάμε να είναι σε ένα χρόνο από τώρα. Και τη λειτουργία αυτού του προγράμματος, ας κάνουν τις ηλικίες, dot ηλικίες κάθετος. Έτσι, τον αριθμό των ατόμων στο δωμάτιο, ας πούμε ότι υπάρχουν τρεις. Και να πούμε, το πρώτο άτομο είναι 13, επόμενο είναι 26, και το τελευταίο είναι 30. Έτσι, τότε θα επαναλάβει πάνω από αυτά τα τρία άνθρωποι, να εκτυπώσετε 14, 27, και 31. Έτσι, να θυμάστε ότι όταν δηλώνουμε μια πίνακα μεγέθους n, οι δείκτες σε ότι array, η σειρά έχει αξίες και δείκτες 0, 1, 2, όλος ο τρόπος έως n μείον 1. Έτσι, όταν είπαμε υπήρχαν τρεις άνθρωποι στην αίθουσα, και βάζουμε εδώ η πρώτη επανάληψη μέσα από αυτό βρόχου, i πρόκειται να είναι 0. Έτσι, στο δείκτη 0. Είμαστε ανάθεση της πρώτης μεγαλώνουμε ο χρήστης εισάγει. Στη συνέχεια, στο επόμενο, περνάμε το δεύτερο n ο χρήστης εισάγει, και δίπλα σε δύο, το τελευταίο n. Έτσι, παρατηρούμε ότι ένας πίνακας μεγέθους τρεις δεν έχει τίποτα στο δείκτη τρία. Αυτό δεν είναι έγκυρη. Εντάξει. Έτσι, πηγαίνοντας πίσω εδώ. Έτσι, τώρα που έχουμε ασχοληθεί με συστοιχίες, έχουμε κάποια εξοικείωση. Τώρα θα πάμε να περάσουμε στην εντολή τα επιχειρήματα της γραμμής, η οποία πρόκειται να αρκετά σχετικά με αυτό το σύνολο του προβλήματος. Έτσι, μέχρι τώρα, κάθε φορά που έχετε δηλώνεται η κύρια λειτουργία σας, έχουμε είπε int main κενό. Έτσι, οι void σημαίνει απλώς ότι δεν περνούν κάθε επιχειρήματα για αυτή τη λειτουργία. Τώρα θα πάμε να δούμε τον βασικό μπορεί να πάρει κάποια επιχειρήματα. Εδώ τα λέμε int argc και κορδόνι παρένθεση argv. Οι παρενθέσεις, για άλλη μια φορά, υποδεικνύοντας ότι έχουμε να κάνουμε με συστοιχίες. Μέχρι εδώ, παρένθεση εγχόρδων argv, είμαστε που ασχολούνται με μια σειρά από χορδές. Έτσι argc, που πρόκειται να υποδείξει πόσα επιχειρήματα έχουμε περάσει σε αυτό το πρόγραμμα. Και για να δούμε τι σημαίνει αυτό, ας κλείσει αυτό. OK. Έτσι, μέχρι τώρα, έχουμε κάνει κάθε πρόγραμμα όπως το dot ηλικίες κάθετο. Μπορούμε, επίσης, στη γραμμή εντολών, το παρελθόν περάσει επιχειρήματα, έτσι ο όρος, εντολή επιχειρήματα της γραμμής. Έτσι, το πρώτο επιχείρημα, hello world. Μέχρι εδώ, argc θα είναι τρεις. Είναι η καταμέτρηση των επιχειρημάτων στη γραμμή εντολών. Argc είναι πάντα τουλάχιστον 1, δεδομένου ότι κουκκίδα μειώσει τις ηλικίες, από μόνη της, μετρά ως ένα από τα τα επιχειρήματα της γραμμής εντολών. Στη συνέχεια, γειά σου είναι το πρώτο. Αν dot ηλικίες κάθετος είναι η μηδενική, τότε γεια είναι η πρώτη, και τον κόσμο είναι η Το δεύτερο επιχείρημα της γραμμής εντολών. Έτσι, το argv εγχόρδων, θα πάμε να δούμε, περιέχει το χορδές, dot κάθετος ηλικιών, γειά σου, και τον κόσμο. Και, κατόπιν αιτήματος του Δαβίδ, θα πάμε να παίξει ένα βίντεο για τη θέσπιση αυτό. [VIDEO PLAYBACK] -Μέχρι τώρα έχουμε προγράμματα γραμμένο, έχουμε δηλώσει κύρια ως int main κενό. Και όλο αυτό το διάστημα, το κενό έχει απλώς διευκρινίζοντας ότι η το πρόγραμμα δεν λαμβάνει καμία επιχειρήματα της γραμμής εντολών. Με άλλα λόγια, όταν ένας χρήστης εκτελεί μια πρόγραμμα, αυτός ή αυτή μπορεί να παράσχει την εντολή τα επιχειρήματα της γραμμής γράφοντας κι άλλα λέξεις ή φράσεις από το πρόγραμμα του όνομα στη γραμμή. Λοιπόν, αν θέλετε το πρόγραμμά σας να λαμβάνουν επιχειρήματα της γραμμής εντολών, ένα ή περισσότερες από αυτές τις λέξεις, θα πρέπει να αντικαταστήσετε άκυρη με ένα ζευγάρι των επιχειρημάτων. Οπότε ας το κάνουμε αυτό. Συμπεριλάβετε CS50.h. Περιλαμβάνει τις τυποποιημένες io.h. Int main. Και τώρα, αντί για κενό, Πάω να καθορίσετε ένα int argc ονομάζεται, και παράταξη των χορδών που ονομάζεται argv. Τώρα, argc και argv είναι απλά συμβάσεων. Θα μπορούσαμε να καλέσει αυτά τα επιχειρήματα σχεδόν οτιδήποτε θέλουμε. Αλλά αυτό που είναι σημαντικό είναι ότι argc είναι ένας int διότι, εξ ορισμού, είναι πρόκειται να περιέχει τον αριθμό επιχείρημα, η αριθμό των λέξεων στο σύνολο ότι η χρήστης έχει πληκτρολογήσει στη γραμμή εντολών του. argv, εν τω μεταξύ, τον φορέα επιχείρημα, είναι πρόκειται να είναι στην πραγματικότητα μια σειρά αποθήκευση όλες τις λέξεις που ο χρήστης έχει πληκτρολογήσει στη γραμμή εντολών του. Ας προχωρήσουμε να κάνουμε κάτι τώρα με ένα ή περισσότερα από αυτά επιχειρήματα της γραμμής εντολών. Ειδικότερα, ας προχωρήσει και να εκτυπώσετε όποια λέξη ο χρήστης πληκτρολογεί μετά το όνομα του προγράμματος στην προτροπή. Άνοιγμα βραχίονα. Κλείστε το στήριγμα. S backslash και το κόμμα τοις εκατό printf. Και τώρα πρέπει να πω printf τι αξία για να συνδέσετε σε αυτό το σύμβολο κράτησης θέσης. Θέλω η πρώτη λέξη που ο χρήστης έχει πληκτρολογήσει το όνομά του προγράμματος, και έτσι Πάω να καθορίσετε argv βραχίονα 1, κοντά παρένθεση, τελεία. Τώρα, γιατί βραχίονα 1 και όχι κλίμακα 0; Λοιπόν, αποδεικνύεται, αποθηκεύονται αυτόματα στο argv 0 πρόκειται να είναι η προγράμματος πραγματικό όνομα. Έτσι, η πρώτη λέξη που πληκτρολογεί ο χρήστης μετά το όνομα του προγράμματος είναι, από σύμβαση, θα είναι αποθηκεύονται σε argv 1. Ας δούμε τώρα την κατάρτιση και εκτελέσετε αυτό το πρόγραμμα. Κάντε argv 0, dot κάθετος argv 0. Και τώρα μια λέξη όπως γειά σου. Enter. Και εκεί το έχετε, γεια σου. [ΤΕΛΟΣ VIDEO PLAYBACK] ROB BODEN: Εντάξει. Κλείστε αυτό. Έτσι, ρίχνοντας μια ματιά σε αυτό το πρόγραμμα που μόλις εισέλθει σε μας, καλά, απλά να δείξει, αν εκτυπώσετε argv 0, κάνετε, τώρα τι είναι αυτό, argv 0, dot κάθετος argv 0. Έτσι, όπως ήταν αναμενόμενο, είναι η εκτύπωση το όνομα του προγράμματος, δεδομένου ότι argv 0 είναι πάντα θα είναι η το όνομα του προγράμματος. Αλλά ας κάνουμε κάτι λίγο πιο ενδιαφέρουσα. Έτσι, στο σύνολο του προβλήματος, θα είστε εισαχθεί σε αυτή τη λειτουργία, atoi. Έτσι, αυτό που χρησιμοποιούμε για atoi; Αυτό πρόκειται να μετατρέψει μια string σε ακέραιο. Έτσι, αν περάσει το string, ένα δύο τρία, να atoi, που θα μετατρέψει ότι στο ακέραιο, ένα δύο τρία. Έτσι θα πάμε για να μετατρέψετε το πρώτο όρισμα της γραμμής εντολών σε ακέραιο αριθμό, και στη συνέχεια να εκτυπώσετε αυτή τη ακέραιο. Έτσι, βασικά, είμαστε το είδος της reimplementing getint, μόνο η ακέραιος εγγράφεται στην εντολή γραμμή αντί για το πρόγραμμα διαδραστικά. Έτσι, στη συνέχεια, κάνοντας argv 0, ας κάνουμε αυτό εδώ, και κλείστε αυτό. Έτσι λειτουργεί argv 0, και ας εισέλθουν στο ακέραιος, ένα δύο τρία τέσσερα ένα δύο. Γι 'αυτό θα εκτυπώσει τον ακέραιο, ένα δύο τρία τέσσερα ένα δύο. Υπάρχουν κάποιες λεπτές αποχρώσεις για να atoi ότι ότι θα σταματήσουν να νοιάζονται για τίποτα πέρα από ένα έγκυρο αριθμητικό χαρακτήρα, αλλά αυτό δεν έχει σημασία. Λοιπόν, τι νομίζετε ότι συμβαίνει αν το κάνω αυτό; Τμηματοποίηση σφάλμα. Τόσο γιατί είναι αυτό; Αν κοιτάξουμε πίσω στο πρόγραμμά μας, είμαστε μετατροπή argv 1, το πρώτο επιχείρημα μετά το όνομα του προγράμματος, σε ακέραιο. Αλλά δεν υπάρχει κανένα επιχείρημα πέρασε μετά το όνομα του προγράμματος. Μέχρι εδώ, βλέπουμε ότι αυτό είναι ένα αμαξάκι του προγράμματος, δεδομένου ότι, αν προσπαθήσουμε να το τρέξει χωρίς επιχειρήματα, θα διακοπεί λίγο. Έτσι, ένα άλλο κοινό μοτίβο που θα δείτε είναι κάτι σαν, αν argc είναι λιγότερο από δύο, υποδεικνύοντας ότι δεν υπήρχε τουλάχιστον το όνομα του προγράμματος και μια Το πρώτο επιχείρημα, τότε θα κάνουμε κάτι όπως printf, δεν είναι αρκετό επιχειρήματα της γραμμής εντολών. Αυτό είναι πιθανώς δεν είναι ένα καλό αποτέλεσμα για την εκτύπωση, είναι πιθανώς κάτι που, όπως θα πρέπει να εισάγετε έναν ακέραιο στη γραμμή εντολών. Θα τελειώσει μόνο εκεί. Και στη συνέχεια επιστρέφουν 1. Έτσι, να θυμάστε ότι στο τέλος του μας πρόγραμμα, αν επιστρέψουμε 0, αυτό το είδος της δείχνει την επιτυχία. Και κύρια επίσης αυτόματα Επιστρέφει 0 αν δεν το κάνουν. Έτσι, εδώ, είμαστε retuning 1 για να δείξει ότι αυτό δεν είναι επιτυχία. Και μπορείτε να επιστρέψετε ό, τι θέλετε, Απλά, 0 δείχνει την επιτυχία, και οτιδήποτε άλλο δείχνει την αποτυχία. Οπότε ας τρέχει αυτή την εκδοχή των πραγμάτων. Έτσι τώρα, αν δεν μπει στη γραμμή εντολών επιχείρημα, αυτό θα πει σωστά μας, δεν είναι αρκετό γραμμή εντολών. Δεν πρόλαβε να τελειώσει τη φράση. Αλλιώς, αν περνάμε πραγματικά ένα, μπορεί να ολοκληρώσει το πρόγραμμα. Έτσι, αυτό είναι το πώς θα χρησιμοποιήσετε το argc προκειμένου να επικυρώσει τον αριθμό των επιχειρήματα της γραμμής εντολών που μετακυλίεται πράγματι. Ας κάνουμε αυτό το πρόγραμμα λίγο πιο περίπλοκη, και κοιτάξτε τη δεύτερη επανάληψης των πραγμάτων. Μέχρι τώρα, δεν είμαστε απλά η εκτύπωση Το πρώτο επιχείρημα της γραμμής εντολών. Εδώ, είμαστε επανάληψη από int i ισούται 0, i είναι μικρότερο από argc, i συν καθώς και την εκτύπωση argv, δείκτη i. Έτσι, αυτό το μοτίβο, και πάλι, αυτό είναι το ίδιο μοτίβο όπως και πριν, εκτός αντί σύγκλησης της μεταβλητής n, είμαστε χρησιμοποιώντας argc. Έτσι, αυτό είναι πάνω από την επανάληψη κάθε δείκτη στη συστοιχία, και εκτύπωση καθένα στοιχείο στην εν λόγω συστοιχία. Και έτσι, όταν θα τρέχει αυτό το πρόγραμμα, και, Εγώ δεν τίθεται κανένα γραμμή εντολών επιχειρήματα, γι 'αυτό ακριβώς εκτυπώσεις το όνομα του προγράμματος. Αν μπαίνω ένα σωρό πράγματα, αυτό θα εκτυπώσετε ένα, το καθένα στη δική της γραμμή. OK. Έτσι, ας ρίξουμε αυτό το ένα βήμα παραπέρα. Και αντί να τα εκτυπώνει κάθε επιχείρημα στη δική της γραμμή, ας εκτυπώσουμε κάθε χαρακτήρα του κάθε επιχειρήματος στη δική της γραμμή. Έτσι, να θυμάστε ότι είναι argv μια σειρά από χορδές. Έτσι τι είναι μια χορδή, αλλά μια σειρά από χαρακτήρες; Έτσι, αυτό σημαίνει ότι argv είναι πραγματικά μια συστοιχία μιας σειράς χαρακτήρων. Έτσι εκμεταλλευόμενοι αυτό, ας το αντιπαρέλθουμε αυτό. Ας εξετάσει το string argv 0. Έτσι, αν θέλουμε να φέρουμε κάθε χαρακτήρα του argv 0 στη δική της γραμμή, τότε θέλω να κάνει το σχέδιο που έχουμε συνηθίσει, i είναι μικρότερο από το μήκος της συστοιχίας, η οποία εδώ, είναι strlen του, που είναι δεν είναι αυτό που θέλω να κάνω, string s ισούται με argv 0. Έτσι το i είναι μικρότερο από το μήκος των μας συστοιχία, η οποία σε αυτή την περίπτωση είναι ένας πίνακας χαρακτήρων, i συν συν. Και έτσι, όπως είδαμε την περασμένη εβδομάδα, είναι ιδανικό αν κινούμαστε έξω strlen της κατάστασης, δεδομένου ότι η θα πρέπει να προστεθεί η strlen του s κάθε φορά που πάμε μέσω του βρόχου, και είναι δεν πρόκειται να αλλάξει. Γι 'αυτό και θα το ίσο με n εδώ οριστεί. OK. Έτσι τώρα, είμαστε επανάληψη πάνω κάθε δείκτη στον πίνακα. Και έτσι, αν θέλουμε να εκτυπώσετε κάθε χαρακτήρα σε αυτόν τον πίνακα, το ποσοστό c είναι η σημαία που θέλετε να χρησιμοποιήσετε για τους χαρακτήρες. Και τώρα ένα στήριγμα i πρόκειται να είναι η σειρά, χαρακτήρας του δείκτη i, οπότε αν το χορδή ήταν γεια. στη συνέχεια s 0 πρόκειται να είναι H, S βραχίονα 1 θα είναι ε, και ούτω καθεξής. Έτσι, τώρα θέλουμε να συνδυάσουμε Αυτά τα δύο πράγματα. Θέλουμε να εκτυπώσετε κάθε χαρακτήρα κάθε όρισμα της γραμμής εντολών. Έτσι θα πάμε για να έχουν ένα ένθετο για το βρόχο. Και συμβατικά, ο πρώτος μετρητής είναι Ι, το επόμενο θα είναι j, n θα είναι η strlen της argv i, i είναι μικρότερη από n, i συν συν. Και τώρα, αντί της εκτύπωσης argv i, έτσι argv βραχίονα i πρόκειται να δείκτη - ότι πρόκειται να είναι η i-οστή γραμμή εντολών επιχείρημα, argv i, j πρόκειται να είναι η j-οστό χαρακτήρα του το επιχείρημα i-th. Θα απαλλαγούμε από αυτό εδώ τώρα δεδομένου ότι το βάζουμε σε αυτό το βρόχο. Έτσι είναι ισοδύναμο με ίσων χορδών s argv i, και στη συνέχεια s βραχίονα j. Λοιπόν, δεν χρειάζεται να δηλώσετε αυτή η μεταβλητή s. Αντ 'αυτού, θα συνδυάσουμε αυτά τα απλά δύο σε ό, τι είχαμε, argv i, j. ΟΜΙΛΗΤΗΣ 1: [δεν ακούγεται]. ROB BODEN: Καλή κλήση. Έτσι, αυτό είναι σπασμένο. Αν εγώ πραγματικά έτρεξε, θα θέλαμε έχουν συνειδητοποιήσει αυτό. Έτσι, ο μετρητής νοιάζομαι σε αυτή τη συγκεκριμένη για βρόχου j, ο iterator. Έτσι θα έχετε τρέξει σε θέματα, ίσως ένας άπειρος βρόχος, αν δεν είχε καθοριστεί αυτό. Αυτός είναι ο λόγος για τον οποίο είμαστε επίσης μιλάμε σχετικά με τον εντοπισμό σφαλμάτων σήμερα. OK. Οπότε ας τρέχει αυτό το πρόγραμμα. Και ας πραγματικά να προσθέσει ένα ξεχωριστό printf ακριβώς εδώ που θα εκτυπώσετε μόνο άλλη γραμμή, δεδομένου ότι αυτό σημαίνει ότι όταν εμείς την εκτέλεση του προγράμματος, θα υπάρξει ένα κενό γραμμή ανάμεσα σε κάθε χαρακτήρα κάθε επιχείρημα της γραμμής εντολών. Λοιπόν, θα δούμε τι σημαίνει αυτό. Oop. Πήρε κάποιο bug. Σφάλμα σιωπηρά δηλώνοντας λειτουργία της βιβλιοθήκης strlen. Έτσι, πηγαίνει πίσω στο πρόγραμμα μας, ξέχασε να hash περιλαμβάνουν string.h. Έτσι string.h πρόκειται να είναι η αρχείο κεφαλίδας που δηλώνει η λειτουργία strlen. OK, που καταρτίζει. Τώρα, ας τρέξει. Έτσι ακριβώς αυτό. Είναι πρόκειται να εκτυπώσετε μας όνομα του προγράμματος, hello world. Είναι πρόκειται να εκτυπώσετε το κάθε πράγμα, κάθε χαρακτήρα, στη δική της γραμμή. OK. Οπότε ας λάβει πράγματι αυτό ένα βήμα παραπέρα. Και αντί να χρησιμοποιούν string.h, ας σκεφτούμε πώς μπορούμε θα εφαρμόσει τη δική μας strlen λειτουργία. Γι 'αυτό θα σας δώσω αμέσως μια υπογραφή λειτουργία. Οπότε ας καλέσει my_strlen, και είναι πρόκειται να λάβει μια σειρά ως επιχείρημα, και περιμένουμε να επιστρέψουν την διάρκεια της εν λόγω σειρά. Λοιπόν, πού είναι αυτός ο τύπος; Ναι. OK. Έτσι, να θυμάστε από την προηγούμενη διαφάνεια που Ήταν, επίσης, από την προηγούμενη εβδομάδα, ότι ένα σειρά χαρακτήρων, αλλά, μια σειρά, οπότε ας πούμε ότι αυτό είναι σειρά μας s. Έτσι, αν s είναι το string, γειά σου, τότε, H-Ε-Ε-Ε-Ο, στη μνήμη, που πρόκειται να είναι, και, στη συνέχεια, αυτό το backslash 0 χαρακτήρας. Επομένως, πώς θα πάρει το μήκος s; Λοιπόν, το τέχνασμα είναι να ψάχνουν για αυτό Backlash 0 χαρακτήρα, αυτό το null τερματιστή. Έτσι, ο αλγόριθμος Πάει να είναι κάτι σαν λίγα αρκετούς χαρακτήρες ώστε - ας ρίξουμε αυτό το χέρι αντιπροσωπεύει κάποια μετρητή, ας την ονομάσουμε αυτό το μήκος int. Έτσι, ξεκινώντας από εδώ, είμαστε πρόκειται να επαναλάβει επί σειρά μας. Έτσι, ο πρώτος χαρακτήρας, είναι Η, και δεν είναι πίσω κάθετο 0, οπότε το μήκος είναι 1. Επαναλάβει στον επόμενο χαρακτήρα, Ε, και δεν είναι backslash 0. Μήκος είναι 2. L, 3. L, 4. O, 5. Και τέλος, φτάνουμε backslash 0, και έτσι αυτό σημαίνει, επίσης, αυτή η σειρά έχει τελειώσει. Οπότε ας επιστρέψουμε 5. Έτσι, στην πραγματικότητα την εφαρμογή, αφενός, μήκους n μου ισούται με 0, το δεξί μου χέρι. Και θα πάμε να μετακινηθείτε - ΟΜΙΛΗΤΗΣ 1: [δεν ακούγεται] ROB BODEN: Γαμώτο. Καλή κλήση. Boom. Έτσι μήκους n ισούται με μηδέν. Έτσι τώρα, ενώ το μήκος s δεν ίση και στη συνέχεια, backslash 0. Έτσι θυμηθείτε, αυτό το backslash 0, είναι μια πραγματικό χαρακτήρα, και αυτό δείχνει το τέλος του string. Ακριβώς όπως, επίσης, backslash n είναι ένα πραγματικό χαρακτήρα. Backslash 0 πρόκειται να υποδείξει το τέλος της συμβολοσειράς μας. Δεν θέλω να θέσω εκεί. Και ενώ s αναπροσαρμόζονται με μήκος που δεν είναι ίση με την μηδενική τερματιστή, τότε είμαστε ακριβώς πρόκειται να αυξήσετε το μήκος. Έτσι λοιπόν, στο τέλος του προγράμματος μας, μήκος είναι τελικά πρόκειται να είναι 5 στην περίπτωση αυτή. Και το μήκος θα επιστρέψω μόνο. OK. Έτσι, τώρα εδώ κάτω, εγώ δεν κάνω κάνει my_strlen. Ας το υπολογίσουν για να βεβαιωθείτε ότι όλα δουλεύουν ρολόι. Έκανα το 2; Ή ήταν ότι το 1; Αυτό πρέπει να κάνουμε. Εντάξει. Έτσι, αυτό είναι argv 2. Λειτουργεί όπως αναμενόταν, αν και ήταν ότι το ένα το έκανα μέσα; Ναι. OK. Αυτή η εκδοχή των πραγμάτων δεν έχουν η printf νέα γραμμή μετά, αλλά δεν κάνει καμία διαφορά. OK. Έτσι λειτούργησε όπως αναμενόταν. Τώρα μπορούμε να συνδυάσετε ακόμη και αυτό το ένα βήμα Επίσης, όταν ειδοποίηση εδώ, καλά, Πρώτα, είμαστε αρπάζοντας το strlen της argv i, και, στη συνέχεια, είμαστε σε επανάληψη κάθε χαρακτήρας σε αυτή τη χορδή. Έτσι, αντί να το κάνουμε αυτό, τι θα γίνει αν Απλά συνδυάζουν αυτή τη λογική της αναμονής μέχρι να χτυπήσει το δικαίωμα backslash 0 σε αυτό για βρόχο; Έτσι επαναλάβει ενώ argv i, j δεν δεν ισούται backslash 0. Οπότε ας το τρέξει για πρώτη φορά. Εντάξει. Έτσι, εδώ, αυτή η κατάσταση λέγοντας - ας ξεκαθαρίσουμε αυτό. Έτσι τώρα, αφήστε αυτό να είναι argv μας. Έτσι, όταν εγώ απλά έτρεξε το πρόγραμμα αυτό πριν, argv είναι ένας πίνακας του χορδές. Και έτσι, αν μπορώ να το τρέξει με dot κάθετο argv 2, hello world, τότε το argv η ίδια είναι μήκους 3, για argv μηδέν, γεια σου, και τον κόσμο. Και στο εσωτερικό του καθενός από αυτούς τους δείκτες είναι, το ίδιο ένας πίνακας, όπου αυτό θα είναι dot, αυτό θα είναι κάθετος, δεν ξέρω αν αυτή ήταν η σωστή κατεύθυνση, I Δεν νομίζω ότι ήταν. Α-Κ-V παύλα, χρειάζονται περισσότερο χώρο. Ας κοπεί σε αυτήν την σειρά. Α-Κ-V παύλα 0, και στη συνέχεια backslash 0. Και στη συνέχεια στην αταξία θα είναι γεια. Ας πούμε, H-Ε backslash 0. Και τέλος, W-Ο κάθετος 0. Έτσι, ο αλγόριθμος που μόλις έγραψε, το ένθετο για βρόχους, τι είναι κάνει είναι, πρέπει πρώτα να το μετρητής ί και στη συνέχεια j. Αυτό θα είναι πιο εύκολη με κωδικό για την οθόνη, Ας πάμε πίσω σε αυτό. OK. Έτσι, παρατηρούμε ότι i είναι η iterator που είναι επανάληψη σε κάθε εντολή όρισμα της γραμμής. Και j είναι ο iterator την επανάληψη πάνω από κάθε χαρακτήρα που Το όρισμα της γραμμής εντολών. Έτσι αυτό εσώτατο printf κάνει είναι, έχουμε printf argv 0 0, printf argv 0 1, printf argv 0 2 0 3 0 4 0 5, 6 0, αλλά τώρα, argv 0 7 πρόκειται να ίση backslash 0. Έτσι, τότε θα βγείτε από ότι για το βρόχο, και τώρα εγώ επαναλαμβάνεται σε 1. Και τώρα θα πάμε για εκτύπωση argv 1 0, 1 1 argv - καλά, τώρα, από τότε που έκοψε γεια σύντομη, argv 1 2 είναι και πάλι πρόκειται να backslash 0. Και έτσι, i αυξήσετε και να συνεχίσει, και ούτω καθεξής, μέχρι να εκτυπώσετε όλα κόσμο, και αυτές είναι τρεις γραμμή εντολών επιχειρήματα, και θα βγείτε έξω από η εξόχως απόκεντρες βρόχο, και τελειώσει το πρόγραμμά μας. OK. Ας επανέλθουμε εδώ. Έτσι θα αποκτήσουν κάποια εξοικείωση με επιχειρήματα της γραμμής εντολών για το θέμα αυτό που το συγκεκριμένο πρόβλημα. Τώρα, τον εντοπισμό σφαλμάτων. Έτσι, πιθανώς να έχετε ήδη έπρεπε να κάνει κάποια εντοπισμού σφαλμάτων με τα προηγούμενα σας πρόβλημα που τίθεται. Και ένας πολύ εύκολος τρόπος για τον εντοπισμό σφαλμάτων, Πρώτα, ας δούμε ένα πρόγραμμα λάθη. Λοιπόν, περπατώντας μέσα από αυτό το πρόγραμμα, θα πάμε να ζητήσει από το χρήστη για ένα ακέραιος, πιάσε αυτό το ακέραιο και, στη συνέχεια, αυθαίρετα, έχουμε ένα βρόχο while που πρόκειται ακριβώς για να μειώσετε i μέχρι να είναι ίση με 10. Ας υποθέσουμε Εισάγω ένας ακέραιος αριθμός μεγαλύτερος από 10. Έτσι μειώσετε i μέχρι να είναι ίση με 10. Και τότε έχουμε μια άλλη βρόχο while ότι, ενώ εγώ δεν είναι ίσο με 0, είμαστε πρόκειται να ελαττώνει i από 3. Έτσι, αν δείτε την πρόθεση του bug εδώ, είναι ότι αυτό θα ελαττώσει i να είναι 10, και στη συνέχεια αυτό το βρόχο while βούληση μείωση i από 10, έως 7, έως 4, έως 1, σε αρνητικό 2, σε αρνητικές 5, και ούτω καθεξής, με αρνητικό άπειρο, από τότε που θα Ποτέ δεν ισούται πράγματι 0. Και στη συνέχεια στο τέλος αυτού του προγράμματος, έχουμε τη συνάρτηση foo η οποία είναι πρόκειται για την εκτύπωση από ότι εγώ. Έτσι, αυτό είναι μια μικρή και ασήμαντη πρόγραμμα, και το σφάλμα είναι προφανές, ειδικά μετά απλά είπε τι το σφάλμα ήταν. Αλλά η πρόθεση εδώ είναι, καλά, αυτό θα μπορούσε στην πραγματικότητα μοιάζουν με κάποια από σας λύσεων από άπληστους από την τελευταία πρόβλημα που, και ίσως έχετε κάποια άπειρο βρόχο στο πρόγραμμά σας, και δεν έχετε καμία ιδέα τι είναι αυτό που προκαλεί. Έτσι, μια πολύ χρήσιμη τεχνική εντοπισμού σφαλμάτων είναι να προσθέσετε λίγο printfs σε όλο τον κωδικό σας. Έτσι, εδώ θέλω μια printf έξω πρώτο loop, ενώ. Και εδώ θέλω μια printf, και εγώ θα εκτυπώσετε μόνο εγώ. Θα κάνω ακόμα και τον πρώτο βρόχο while, i. Έξω, ενώ το δεύτερο loop. Για άλλη μια φορά, να εκτυπώσετε μέσα από εδώ, η τιμή i. Και ας τρέχει αυτό. Έτσι dot debug κάθετο. Εισάγετε έναν ακέραιο αριθμό. Ας κάνουμε 13. Και έκρηξη. Βλέπουμε ότι είμαστε άπειρη looping στο εσωτερικό του δεύτερου βρόχου while. Μέχρι τώρα γνωρίζουμε τι είναι το σφάλμα. Αλλά printf debugging είναι απολύτως μεγάλη, αλλά μόλις τα προγράμματά σας να πάρετε περισσότερο και πιο περίπλοκη, υπάρχουν πιο εξελιγμένες λύσεις σε να πάρει τα πράγματα που εργάζονται. Οπότε ας αφαίρεση όλων αυτών των printfs. Και ας βεβαιωθείτε ότι δεν το έκανα σπάσει τίποτα. OK. Έτσι, το πρόγραμμα θα πάμε να εισαγάγει καλείται GDB, για το GNU Debugger. Λοιπόν, στην πραγματικότητα, ας αφαίρεση debug για ένα δεύτερο, και να κάνει και πάλι debug. Λοιπόν, στην πραγματικότητα το πρώτο, ένα καλό μάθημα στα επιχειρήματα της γραμμής εντολών. Σημειώστε ότι αυτή η Clang εντολή που κατάρτιση πάντα είναι να περάσει στη γραμμή εντολών, αυτές επιχειρήματα της γραμμής εντολών. Έτσι, ακριβώς πώς θα έχετε την ευκαιρία να χρησιμοποιούν επιχειρήματα της γραμμής εντολών, όπως έκανε πριν, και όπως θα σε PSET 2, αυτό είναι το πώς Clang τους χρησιμοποιούν. Έτσι, παρατηρούμε ότι αυτή η πρώτη σημαία, παύλα ggdb3, τι λέει είναι, Clang, θα πρέπει να συγκεντρώσει αυτό το αρχείο με το πρόθεση ότι θα είμαστε τελικά πρέπει να το debug. Έτσι εφ 'όσον έχετε αυτή τη σημαία, τότε μπορούμε να GDB debug. Και αυτό θα ανοίξει το GNU Debugger. Έτσι, υπάρχουν πολλές εντολές ότι θα πρέπει να το συνηθίσετε. Πρώτος που πιθανότατα θα σας χρειάζονται άμεσα είναι Run. Έτσι τι είναι Run πρόκειται να κάνει; Είναι πρόκειται να ξεκινήσει το πρόγραμμά μας. Έτσι, τρέχει, το πρόγραμμα εκκίνησης, το πρόγραμμα μας ζητάει έναν ακέραιο, 13. Και τότε είναι άπειρη looping, όπως Αναμένεται, πλην I αφαιρεθεί το printfs, οπότε δεν χρειάζεται καν να το δω αυτό. Βγήκε κανονικά. Αχ. Είναι πιθανό ότι τυλιγμένα όλα τα τρόπος γύρω, πίσω - αγνοείται το γεγονός ότι. Ας υποθέσουμε ότι δεν έχει τερματίσει κανονικά. Υπάρχει μια περίπλοκη απάντηση σε αυτό. Μέχρι τώρα, αυτό δεν είναι πολύ χρήσιμο. Έτσι ακριβώς λειτουργεί το πρόγραμμά μας μέσα από αυτό το πρόγραμμα εντοπισμού σφαλμάτων δεν μας βοηθά σε κάθε Έτσι, από τη στιγμή που θα μπορούσε να έχει μόλις κάνει dot κάθετος debug από το εξωτερικό GDB. Έτσι, η μία εντολή που θα χρειαστεί κατά πάσα πιθανότητα - και θα σταματήσουν αυτό. Control-d ή να σταματήσουν, τόσο το έργο. Ας το ανοίξουμε πάλι. Μια άλλη εντολή που θα πρέπει πιθανώς αμέσως θέλουν να συνηθίσουν να είναι Break. Έτσι θα σπάσει την κύρια προς το παρόν, και στη συνέχεια θα το εξηγήσω αυτό. Λοιπόν, εδώ βλέπουμε θέτουμε ένα σημείο διακοπής σε αυτή τη γραμμή στο debug.c. Λοιπόν, τι διάλειμμα μέσα είναι ότι όταν πληκτρολογήσετε run, το πρόγραμμα πρόκειται να συνεχίσει να λειτουργεί μέχρι Χτύπησα ένα σημείο διακοπής. Έτσι, όταν χτύπησα τρέξιμο, το πρόγραμμα ξεκινά, και στη συνέχεια σπάει αμέσως μόλις εισέρχεται στην κύρια λειτουργία. Σπάστε κύρια πρόκειται να είναι κάτι έχετε πολύ συχνά το κάνουν. Και τώρα, για να σας παρουσιάσουμε σε ορισμένες περισσότερες εντολές. Σημειώστε εδώ, ότι λέει ότι έσπασε στη γραμμή 11, η οποία είναι printf, εισάγετε έναν ακέραιο αριθμό. Έτσι, η εντολή Επόμενο πρόκειται να είναι το πώς πάμε στην επόμενη γραμμή κώδικα. Αυτό πρόκειται να μας επιτρέψει να εντείνουν μέσω της γραμμής του προγράμματος μας γραμμή. Έτσι, την επόμενη. Τώρα γραμμή 12, θα πάμε για να πάρει το ακέραιο. Επόμενο. Και αν απλά να πατήσετε το Enter και πάλι, αυτό θα επαναλάβετε το τελευταίο πράγμα που κάνατε. Γι 'αυτό και δεν χρειάζεται να πληκτρολογήσετε επόμενη κάθε φορά. Έτσι, εισάγετε έναν ακέραιο αριθμό, 13. Έτσι τώρα, γραμμή 14, ενώ το i είναι μεγαλύτερο από 10, και θα κάνω το επόμενο. Και βλέπουμε εμείς πάμε για να μειώσετε i. Έτσι θα πάμε για να μειώσετε i ξανά. Έτσι, τώρα, ένα άλλο χρήσιμο εντολή είναι Εκτύπωση. Έτσι Εκτύπωση πρόκειται να εκτυπώσετε η τιμή της μεταβλητής. Ας αναδείξει την αξία της μεταβλητής i. Ας εκτυπώσετε i. Δεν πρόκειται να πω ότι είναι 11. Τώρα έχουμε και πάλι Next, ενώ i είναι μεγαλύτερος από 10. Γι 'αυτό και είναι ακόμη μεγαλύτερη από ό, τι 10, δεδομένου ότι είναι 11. i μείον μείον. Ας εκτυπώσετε i ξανά. Όπως ήταν αναμενόμενο, είναι 10. Μέχρι τώρα, το επόμενο. Είναι πηγαίνει πίσω στην κατάσταση i είναι μεγαλύτερο από 10, αλλά εγώ τώρα είναι 10, έτσι δεν είναι μεγαλύτερος από 10, οπότε αναμένουμε να πέσουν έξω από τον βρόχο while. Και τώρα είμαστε κάτω από την γραμμή του κώδικα. Και μια άλλη εντολή, List, είναι ακριβώς πρόκειται για να εμφανίσετε την προηγούμενη και την επόμενη μερικές γραμμές κώδικα, σε Αν εαυτό σας χάνεται. Γι 'αυτό και μόλις βγήκε από αυτό το βρόχο while, και τώρα έχουμε εισέλθει σε αυτό while loop, γραμμή 18. Έτσι, ενώ εγώ δεν είναι ίσο με 0. Και, στη συνέχεια, i i ισούται με μείον 3, και θα παρατηρήσετε, αυτό απλά θα συνεχίσω. Και θα μπορώ να εκτυπώσετε. Κάθε εντολή είδος έχει συντομεύσεις. Έτσι, p είναι μικρή για εκτύπωση. Έτσι μπορούμε p i. Απλά κρατήστε πατημένο n, ή συνεχίστε να κάνετε Επόμενο. Εκτυπώστε ξανά το i. Βλέπετε τώρα είναι αρνητικό 167. Έτσι, αυτό θα συνεχιστεί επ 'αόριστον, αλλά δεν πραγματικά πάντα, από τη στιγμή που μόλις είδατε, το στην πραγματικότητα θα καταλήξετε σε κάποιο σημείο. Έτσι ώστε η Αρχή GDB. Αλλά ας κάνουμε ένα πράγμα στο GDB. Χμ, debug. Έτσι, σε αυτή τη συγκεκριμένη περίπτωση, η άπειρο βρόχο έτυχε να είναι στο εσωτερικό του η κύρια λειτουργία. Και για τώρα, απλά αποδέχονται ότι ότι είμαι πρόκειται να μετακινήσετε το άπειρο βρόχο σε η συνάρτηση foo. Απλά να θυμάστε ότι, στο τέλος αυτού του πρόγραμμα, καλά, αυτό ήταν αρχικά καλώντας foo, ο οποίος ήταν μόλις πρόκειται να εκτυπώσετε i. Αλλά τώρα είμαστε καλώντας foo, η οποία είναι πρόκειται να μειώσετε i μέχρι να είναι 0, και στη συνέχεια, εκτυπώστε αυτή τη μεταβλητή. OK. Αποθηκεύστε αυτό. Κάντε debug. Και τώρα, gdb debug. OK. Έτσι, αν θέλω απλώς να τρέξει, τότε εγώ δεν πρόκειται να να είναι σε θέση να ενισχύσει πραγματικά μέσα μου προγράμματος γραμμή-γραμμή. Έτσι, ας σπάσει σε κεντρικό, και στη συνέχεια να πληκτρολογήσετε τη λέξη run. Έτσι, περνούν από αυτό, printf, πληκτρολογήστε ακέραιος, να πάρει τον ακέραιο, 13. Έτσι θα πάμε για να κρατήσει που μειώνεται, μέχρι να είναι μεγαλύτερο από 10. Στη συνέχεια, θα πάμε να πέσει μέσα από το while loop, και να φτάσει στη γραμμή - ας ανοίξει σε ξεχωριστό παράθυρο. Γι 'αυτό και μειώνεται μέχρι που δεν ήταν πλέον μεγαλύτερο από 10, και τότε κάλεσε τη λειτουργία, foo. Έτσι, ό, τι συνέβη το συντομότερο χτύπησα συνάρτηση foo, καλά, κάλεσα foo, και τότε δεν είχα πλέον τον έλεγχο της GDB. Έτσι, μόλις χτύπησα Επόμενο σε αυτή τη γραμμή, τα πράγματα συνεχίζονταν μέχρι να συμβεί αυτό, όπου το πρόγραμμα βγήκε, όταν - υποθέσουμε ότι δεν υπήρχε τελικά. Είδατε να σταματήσουμε για λίγο όμως. Έτσι, γιατί έχω χάσει τον έλεγχο το πρόγραμμα σε εκείνο το σημείο; Λοιπόν, όταν πληκτρολογείτε την επόμενη, που πηγαίνει στο η κυριολεκτική επόμενη γραμμή κώδικα που θα εκτελέσει. Έτσι, μετά την γραμμή 21, η επόμενη γραμμή κώδικα που θα εκτελέσει είναι η γραμμή 22, η οποία είναι, κατά την έξοδο από το κύριο. Γι 'αυτό και δεν θέλω να πάω απλά στην επόμενη γραμμή κώδικα. Θέλω να πάω στη λειτουργία, foo, και στη συνέχεια, επίσης, βήμα μέσα αυτές τις γραμμές κώδικα. Έτσι, γι 'αυτό, έχουμε μια εναλλακτική λύση. Ας σταματήσουν ότι και πάλι. Σπάστε κύριο. Uh, 1, δίπλα, δίπλα, 13, δίπλα, Στη συνέχεια, δίπλα, προσεκτικά, πριν χτυπήσει γραμμή foo. OK. Έτσι τώρα, είμαστε στη γραμμή 21, όπου καλούμε foo. Δεν θέλουμε να πληκτρολογήσετε στη συνέχεια, δεδομένου ότι η θα καλέσει μόνο τη συνάρτηση foo, και μεταβείτε στην επόμενη γραμμή κώδικα. Αυτό που θέλουμε να χρησιμοποιήσουμε είναι βήμα. Έτσι, υπάρχει μια διαφορά μεταξύ του Σταδίου και συνέχεια, όπου Βήμα βήματα στο λειτουργεί, και Next πηγαίνει πάνω από την λειτουργία. Εκτελεί μόνο το σύνολο των η λειτουργία και συνεχίζει. Έτσι Βήμα πρόκειται να μας φέρει στη λειτουργία, foo. Και βλέπουμε εδώ, τώρα, είμαστε πίσω στο Αυτό βρόχος while είναι, θεωρητικά, πρόκειται να συνεχιστεί για πάντα. Και αν χτυπήσει βήμα, όταν δεν είναι καν μια λειτουργία για να καλέσετε, τότε είναι ταυτόσημη με Next. Έτσι, μόνο όταν είστε σε μια γραμμή που καλεί μια λειτουργία που Βήμα πρόκειται να διαφέρουν από Next. Έτσι, βήμα που θα μας φέρει εδώ. Βήμα, το βήμα, το βήμα, το βήμα, το βήμα, το βήμα, και εμείς θα πρέπει ακριβώς άπειρο βρόχο για πάντα. Έτσι, μπορείτε να συνηθίσουν σε αυτό που σας τρόπος προσδιορισμού άπειρες φορές, είναι απλά κρατώντας αυτό το πλήκτρο Enter για να δείτε πού θα κολλήσει. Υπάρχουν καλύτεροι τρόποι να το κάνουμε αυτό, αλλά για τώρα, αυτό είναι απολύτως επαρκής. Και στυλιστικά, να συμμορφώνονται με στυλ 50, θα έπρεπε να είχα κάνει αυτό. OK. Έτσι, μια τελευταία εντολή για την εισαγωγή. Λοιπόν, ας το GDB debug μέσα Έτσι, αντί να σπάσει σε κύρια, αν γνωρίζουν τη λειτουργία foo είναι επίσης η το πρόβλημα, τότε θα μπορούσα να έχω μόνο είπε, να σπάσει σε foo, αντ 'αυτού. Ας πούμε ότι σπάνε σε την κύρια και την foo. Έτσι, μπορείτε να ορίσετε ως πολλά σημεία διακοπής όπως θέλετε. Όταν πληκτρολογήσετε run, πρόκειται να σταματήσει κατά τη - ooh, ας ξαναμεταγλωττίσετε, δεδομένου Άλλαξα τα πράγματα. Θα δείτε αυτή τη γραμμή, Warning, πηγή το αρχείο είναι πιο πρόσφατη από εκτελέσιμο. Έτσι, αυτό σημαίνει ότι Πήγα εδώ και άλλαξε αυτές να συμμορφώνονται με στυλ 50, αλλά δεν είχα recompile το πρόγραμμα. Έτσι GDB με κάνει να συνειδητοποιήσω αυτό. Θα σταματήσουν, κάνουν πάλι debug, χτύπησε gdb debug. OK. Έτσι τώρα, πίσω σε ό, τι έκανα. Διάλειμμα κύρια, διάλειμμα foo. Τώρα, αν θα τρέξει το πρόγραμμα, έτσι ώστε να είναι πρόκειται να συνεχιστεί έως ότου χτυπά breakpoint. Αυτό συμβαίνει σε σημείο διακοπής είναι η πρώτη στην κύρια. Τώρα, αντί να κάνει την επόμενη, δίπλα, δίπλα, δίπλα, δίπλα, μέχρι να χτυπήσει foo, I να πληκτρολογήσετε συνεχιστεί, η οποία θα συνεχιστεί μέχρι να χτυπήσει το επόμενο σημείο διακοπής. Θα πρέπει να εισάγετε τον ακέραιο πρώτα. Συνέχεια θα συνεχιστεί μέχρι να χτυπήσει το επόμενο σημείο διακοπής, η οποία είναι ότι λειτουργία του foo. Έτσι Run θα διαρκέσει μέχρι να χτυπήσει ένα breakpoint, αλλά θα πληκτρολογήσετε μόνο όταν τρέχει ξεκινάτε το πρόγραμμα και, στη συνέχεια, από τότε, είναι να συνεχίσει. Αν έκανα ακριβώς σπάσει κύρια και Στη συνέχεια έτρεξε, αυτό θα σπάσει σε κύρια, και στη συνέχεια να συνεχίσει. Δεδομένου ότι δεν έχω ένα σημείο καμπής στο foo, εισάγετε το ακέραιο, στη συνέχεια, τώρα είμαι δεν πρόκειται να σπάσει στο foo. Είναι ακριβώς πρόκειται να άπειρο βρόχο μέχρι που. OK. Έτσι ώστε να είναι Εισαγωγή στην GDB. Θα πρέπει να αρχίσετε να χρησιμοποιείτε το το πρόβλημα σύνολα σας. Μπορεί να είναι πολύ χρήσιμη για τον εντοπισμό bugs. Αν στην πραγματικότητα απλά, γραμμή-γραμμή, πηγαίνετε μέσα στον κώδικα, και να συγκρίνουν τι είναι πραγματικά συμβαίνει με ό, τι θα περίμενε κανείς να συμβεί, τότε είναι αρκετά δύσκολο να χάσετε τα σφάλματα σου. OK. Έτσι, την περασμένη εβδομάδα ο David μεγαλώσει αυτό μυστικού κλειδιού κρυπτογράφησης πράγματα για το για πρώτη φορά, όπου δεν θέλουμε κωδικούς πρόσβασης μόνο να αποθηκευτεί σε μας υπολογιστή σε κάποιο απλό αρχείο κειμένου, όπου κάποιος μπορεί να έρθει ξανά και απλά να το ανοίξετε και να τις διαβάσετε. Ιδανικά, θα πρέπει να κρυπτογραφηθεί με κάποιο τρόπο. Και στο πρόβλημα Set 2, θα πρέπει να ασχολείται με μια μέθοδο κρυπτογράφησης, ή, επίσης, δύο μεθόδους, αλλά δεν είναι τόσο μεγάλη. Αν κάνετε την έκδοση του χάκερ, είστε Επίσης, πρόκειται να ασχολείται με αποκρυπτογράφηση κάποια πράγματα. Έτσι, το θέμα τώρα είναι, επίσης, ακόμη και αν έχουμε την ισχυρότερη κρυπτογράφηση αλγόριθμο στον κόσμο, αν επιλέξετε ένα ιδιαίτερα κακή κωδικό πρόσβασης, τότε δεν θα σας βοηθήσει πάρα πολύ, δεδομένου ότι οι άνθρωποι θα εξακολουθεί να είναι σε θέση να το καταλάβω. Ακόμα κι αν βλέπουμε την κρυπτογραφημένη συμβολοσειρά και μοιάζει με ένα σωρό από σκουπίδια ότι δεν σημαίνει τίποτα για αυτούς, αν ακόμα απλά πρέπει να δοκιμάσετε μερικά κωδικούς πρόσβασης να το καταλάβω, τότε θα δεν είναι πολύ ασφαλής. Έτσι, βλέποντας ένα βίντεο που καθιστά αυτό το σημείο. [VIDEO PLAYBACK] -Κράνη, θα δαίμονας. Τι συμβαίνει; Τι κάνεις με την κόρη μου; -Επιτρέψτε μου να εισαγάγει το λαμπρό νέους πλαστικό χειρουργό, ο Δρ Phillip Σλότκιν, η μεγαλύτερη μύτη άνθρωπος εργασία σε ολόκληρο το σύμπαν, και το Μπέβερλι Χιλς. -Σας Υψηλότατε. -Δουλειά μύτη; Δεν καταλαβαίνω. Έχει ήδη είχε μια εργασία μύτης. Ήταν ένα γλυκό δεκαέξι παρόν. -Όχι. Δεν είναι αυτό που νομίζεις. Είναι πολύ, πολύ χειρότερα. Αν δεν μου δώσετε το συνδυασμό με η ασπίδα του αέρα, ο Δρ Σλότκιν θα δώσει πίσω την κόρη σου παλιά μύτη της. -Όχι. Πού το βρήκες αυτό; -Εντάξει. Θα το πω. Θα το πω. Όχι, μπαμπά. Όχι, δεν πρέπει. -Εχεις δίκιο, αγαπητέ μου. Θα μου λείψει η νέα μύτη σας. Αλλά δεν θα του πω το συνδυασμό, δεν έχει σημασία τι. -Πολύ καλά. Ο Δρ Σλότκιν, όσο χειρότερα τόσο καλύτερα. -Μου ευχαρίστηση. [TOOLS είναι αιχμηρή] -Όχι. Περιμένετε. Περιμένετε. Θα το πω. Θα το πω. -Το ήξερα ότι θα μπορούσε να λειτουργήσει. Εντάξει. Δώστο μου. -Ο συνδυασμός είναι ένα. -One. -One. -Δύο. -Δύο. -Δύο. -Τρία. -Τρία. -Τρία. -Τέσσερα. -Τέσσερα. -Τέσσερα. -Πέντε. -Πέντε. -Πέντε. -Έτσι, ο συνδυασμός είναι ένα, δύο, τρία, τέσσερα, πέντε. Αυτό είναι το πιο χαζό συνδυασμός Έχω ακούσει ποτέ στη ζωή μου. Αυτό είναι το είδος των πράγμα που ένας ηλίθιος θα έχει στις αποσκευές του. -Σ 'ευχαριστώ, Υψηλότατε. -Τι έκανες; -Γύρισα από τον τοίχο. -Όχι, δεν το έκανε. Έχετε απενεργοποιήσει ολόκληρη την ταινία. -Θα πρέπει να πατήσετε το κουμπί λάθος. -Λοιπόν, το βάζουμε πίσω. Βάλτε την ταινία πίσω. -Ναι, κύριε. Ναι, κύριε. -Πάμε, Arnold. Έλα, Γκρέτσεν. Φυσικά, ξέρετε εγώ θα εξακολουθεί να Πρέπει να σας χρεώσει για αυτό. [ΤΕΛΟΣ VIDEO PLAYBACK] ROB BODEN: Εντάξει. Έτσι, τώρα που είμαστε ήδη μιλάμε για ασφάλειας κατά κάποιο τρόπο, ωραίο μικρή αφίσα της ταινίας, ώστε τα τελευταία ημέρες, τα θέματα αυτά με την NSA παρακολουθούν τα πάντα. Μπορεί να είναι δύσκολο να νιώθετε σαν να έχουν κάποιο είδος της ιδιωτικής ζωής στον σε απευθείας σύνδεση κόσμο, αν και δεν θα μπορούσα να πω που οι περισσότεροι από τα στοιχεία του PRISM. Έτσι, προχωρώντας πέρα ​​από PRISM, εμείς δεν πρόκειται να μιλάμε γι 'αυτό, τώρα σκεφτείτε για το laptop σας. Έτσι, εδώ, θέλω να στραφούν την πραγματική λογαριασμό μου, με μικρό πιγκουίνο μου. Έτσι έχω ένα σύνολο κωδικό πρόσβασης, και ότι κωδικός πρόσβασης είναι ό, τι θέλω να είναι. Αλλά να θυμάστε ότι αυτό που είμαι υλοτομία με, έτσι ώστε αυτή η σύνδεση προτροπή, είναι κάποιο πρόγραμμα. Είναι κάποιο πρόγραμμα που ήταν γραμμένο από κάποιο πρόσωπο. Και έτσι, το πρόσωπο αυτό, αν είναι ιδιαίτερα κακόβουλο, θα μπορούσαν έχουν πει, εντάξει, οπότε αν ο κωδικός ότι μπαίνω είναι ίση με μου πραγματικό κωδικό πρόσβασης, ή να είναι ίση σε κάποιο ειδικό κωδικό πρόσβασης - Ο David είναι φοβερό ή κάτι τέτοιο - Στη συνέχεια τους άφησαν να μπω Έτσι, ένας κακόβουλος προγραμματιστής θα μπορούσε να έχει πρόσβαση σε όλα τα Macs σας, ή Παράθυρα, ή οτιδήποτε. Έτσι, αυτό δεν είναι πολύ από μια ανησυχία, δεδομένου ότι, Θέλω να πω, αυτό είναι το login πρόγραμμα αυτό είναι που αποστέλλονται με το OS X, εκατοντάδες ή χιλιάδες άνθρωποι έχουν αξιολόγηση αυτού του κώδικα. Και έτσι, αν, στον κώδικα σας κάπου, θα να πω αν αυτή η σειρά ισούται ισούται Ο David είναι φοβερό, login, τότε κάποιος είναι πρόκειται να είναι, όπως, περιμένετε. Αυτό δεν είναι σωστό. Αυτό δεν πρέπει να είναι εδώ. Έτσι, αυτός είναι ένας τρόπος για να βάλουμε τα πράγματα να είναι το είδος του ασφαλούς. Αλλά σκεφτείτε ακόμη και προγράμματα ότι έχετε γράψει. Ας υποθέσουμε ότι έχεις γράψει το πρόγραμμα login. Έτσι, αυτό το πρόγραμμα σύνδεσης που γράψατε, οπότε προφανώς, θα είναι μια καλή προγραμματιστής. Δεν πρόκειται να θέσει οποιοδήποτε κακόβουλο αν το x είναι ίσο ισούται David είναι φοβερό στον κώδικα σας. Αλλά αυτό το πρόγραμμα, τι θα κάνεις χρησιμοποιούν για την κατάρτιση αυτού του προγράμματος; Κάτι σαν Clang. Τι κι αν το πρόσωπο που έτυχε να γράψτε Clang ειδική περικλείεται σε Clang κάτι σαν, αν είμαι κατάρτιση του login προγράμματος, και στη συνέχεια εισάγετε τον κωδικό αυτό στο πρόγραμμα σύνδεσης που λέει, αν x ισούται ισούται David είναι φοβερό; Έτσι, δεν είναι αρκετά ακόμα, αλλά έχουμε την ίδια εκδίδει εδώ, όπου Clang, καλά, χιλιάδες, αν όχι δεκάδες χιλιάδες άνθρωποι, έχουν κοίταξε Clang, έχουν εξέτασε τις γραμμές του κώδικα και είπε, Εντάξει, δεν υπάρχει τίποτα κακό εδώ. Προφανώς, κανείς δεν κάνει τίποτα αυτό το κακόβουλο. Αλλά τι είναι η ίδια κλαγγή, όπως, τι κι αν κάνω compile Clang; Τι γίνεται αν έχω κάποια compiler που καταρτίζει Clang που εισάγει στο Clang αυτό το ειδικό hack που λέει, εντάξει, όταν καταρτίζουν Clang, τότε η εκτελέσιμο παίρνω πρέπει ειδικά να εξετάσουμε στο εσωτερικό του προγράμματος login και το ένθετο αυτός ο κωδικός πρόσβασης, ισούται με ίσους Ο Dave είναι φοβερό; Έτσι, να θυμάστε ότι το ίδιο compiler σας πρέπει να καταρτίζονται σε κάποιο σημείο. Έτσι, αν το τι θα επιλέξετε για την κατάρτιση Clang με, το ίδιο είναι κακόβουλο, τότε θα θα μπορούσε να βιδωθεί το σύνολο τρόπο κάτω από τη γραμμή. Μέχρι εδώ, έχουμε Ken Thompson και Dennis Ritchie. Έτσι, αυτό είναι μια εικονική φωτογραφία. Dennis Ritchie είναι στα δεξιά. Αυτός είναι ένας σημαντικός - λίγο πολύ έγραψε C. Έτσι, μπορείτε να Τον ευχαριστώ γι 'αυτή την κατηγορία. Ken Thomson είναι στα αριστερά. Οι δυο τους έγραψαν βασικά UNIX. Λοιπόν, ήταν σημαντικοί συνεισφέροντες στο UNIX. Υπήρχαν μερικά άλλα. Έτσι ο Ken Thompson, σε κάποιο σημείο, κερδίζει το βραβείο Turing. Και το βραβείο Turing, έχω ακούσει πάντα να αναφέρεται με αυτόν τον τρόπο, είναι το Νόμπελ της επιστήμης των υπολογιστών. Έτσι, κατά το Βραβείο Turing, έχει να δώσει την ομιλία αποδοχής του. Και δίνει αυτό το πολύ διάσημη ομιλία τώρα, που ονομάζεται Σκέψεις για Εμπιστοσύνη Trust, το οποίο έχουμε συνδέονται να στην ιστοσελίδα του μαθήματος. Και σε αυτή την ομιλία, λέει, εντάξει, έτσι έγραψα UNIX, και τώρα όλοι εσείς οι άνθρωποι χρησιμοποιούν UNIX. Τώρα, να θυμάστε ότι το Linux σήμερα είναι άμεσος απόγονος του UNIX. OS X χρησιμοποιεί άμεσα UNIX. Τα Windows δεν κάνει τόσα πολλά, αλλά πολλά ιδεών ελήφθησαν από το UNIX. Έτσι, ανεβαίνει στη σκηνή και λέει, Εντάξει, έγραψα UNIX. Και ακριβώς έτσι εσείς ξέρετε, είμαι είναι σε θέση να συνδεθείτε σε κάθε ένα από τους υπολογιστές σας. Επειδή έβαλα μία από αυτές τις ειδικές, αν x ισούται ισούται Ken Thomson είναι φοβερό, τότε επιτρέπεται να κάνω login. Έτσι, οι άνθρωποι είναι όπως, επίσης, Πως το κάνεις αυτό; Κοιτάξαμε το πρόγραμμα σύνδεσης και τίποτα δεν είναι εκεί. Είναι σαν, λοιπόν, το τροποποιημένο compiler να συνδεθείτε στο πρόγραμμα σύνδεσης έτσι ώστε το πρόγραμμα εισόδου θα έχουν τώρα ότι το x ισούται ισούται Ken Thompson είναι φοβερό. Και λένε, καλά, αυτό δεν είναι αλήθεια. Κοιτάμε τον compiler, και η compiler δεν έχει γραμμές κώδικα όπως αυτό. Είναι σαν, εντάξει, αλλά τι είσαι την κατάρτιση του compiler με; Και νομίζουν, και αυτός είναι, όπως, επίσης, Είμαι αυτός που σας έδωσε ο compiler που χρησιμοποιείτε για να καταρτίσει τον compiler, έτσι είστε σύνταξη ενός compiler, ότι το ίδιο είναι κακόβουλο, και θα σπάσει το πρόγραμμα login. Έτσι, βασικά, σε εκείνο το σημείο, δεν υπάρχει κανένας τρόπος που θα μπορούσαμε να εξετάσουμε την πηγή κώδικα του προγράμματος login για να δούμε τι είναι λάθος. Δεν θα μπορούσε ακόμη και να δούμε στο πηγαίο κώδικα του μεταγλωττιστή για να δούμε τι είναι λάθος. Θα πρέπει να εξετάσουμε το μηχάνημα κώδικα, το πραγματικό δυαδικό του καταρτίζονται compiler να δείτε, περιμένετε, οι γραμμές κώδικα δεν πρέπει να είναι εδώ. Αλλά ο Ken Thompson πήρε ένα βήμα περαιτέρω και είπε, επίσης, ότι υπάρχουν αυτά τα ειδικά προγράμματα που πραγματικά σας βοηθήσει να διαβάσετε το δυαδικό των προγραμμάτων, και έτσι αν κάποιος χρησιμοποίησε αυτό το πρόγραμμα για την διαβάσετε το δυαδικό, θα δείτε αυτά γραμμές κώδικα. Τροποποίησε τα προγράμματα αυτά να πω, όλα Εντάξει, αν ψάχνετε κατά τη compiler, δεν παρουσιάζουν αυτό το συγκεκριμένο σύνολο των εκτελέσιμων. Έτσι, τότε θα πρέπει να λάβει ότι ένα βήμα περαιτέρω και ουσιαστικά, ότι θα μπορούσαν να έχουν λαμβάνονται πολλαπλά επίπεδα indirection, και σε κάποιο σημείο, κανείς δεν είναι πραγματικά πρόκειται να είναι ο έλεγχος. Έτσι, το ηθικό δίδαγμα της ιστορίας είναι, είστε δεν πρόκειται να γράφει Κλαγγή σε αυτή την κατηγορία. Θα πάμε να χρησιμοποιούν αναρρίχηση Κλαγγή πολλά σε αυτή την κατηγορία. Για όλα τα ξέρετε, Clang είναι ένα κακόβουλο πρόγραμμα που έχει σαμποτάρει κάθε ενιαίο πρόγραμμα που έχετε συντάξει ποτέ. Και για να σας αφήσει σε αυτό το πολύ δυσοίωνο Σημειώστε, μπορείτε να δείτε την Τετάρτη. [Χειροκροτήματα] ΟΜΙΛΗΤΗΣ 2: Στην επόμενη CS50. ΟΜΙΛΗΤΗΣ 3: Μην τολμήσεις να το πεις αυτό. Μπορείτε να το κάνετε αυτό. Έχετε κάνει πριν από αυτό, μπορείτε να το κάνετε αυτό Σήμερα, μπορείτε να το κάνετε αυτό αύριο. Έχετε κάνει αυτό για χρόνια. Απλά πηγαίνετε εκεί και να το κάνουμε αυτό. Μπορείτε να το κάνετε αυτό. [Παίζει μουσική]