[MUZIK Bermain] ROB Boden: Baiklah. Jadi, perkara pertama yang pertama, video dari muka yang biasa. [VIDEO MAIN SEMULA] -Baiklah. Ini adalah CS50, dan ini adalah awal minggu tiga. Saya minta maaf saya tidak dapat berada di sana dengan anda hari ini, tetapi izinkan saya untuk memperkenalkan CS50 sendiri Rob Boden. [END VIDEO MAIN SEMULA] [Tepukan dan sorakan] ROB Boden: The Filmography dalam video yang hebat. Baiklah. Jadi pertama, ada makan tengah hari yang lain. Ia esok pada 1:15. Tiada makan tengah hari Jumaat ini. Ia adalah dengan Quora. Dan Tommy tiada di sini lagi, tetapi salah satu daripada penduduk di sana adalah bekas CF kepala, Tommy McWilliam. Jadi dia seorang lelaki yang menyeronokkan. Anda harus datang. Baiklah. Jadi minggu lepas, kami mula berpecah tentang apa yang rentetan sebenarnya. Kami telah dikenali sejak awal bahawa ia jujukan aksara. Tetapi minggu lepas, kami mengulas tentang hakikat bahawa apa yang benar-benar satu urutan watak-watak, baik, kami kini mempunyai tatasusunan aksara. Dan kita tahu bahawa rentetan, ia satu pameran aksara, pada akhir sangat, kita mempunyai null bait khas, ini garis sendeng terbalik 0, yang menunjukkan akhir tali. Dan sebagainya rentetan adalah pelbagai watak-watak, tetapi kita boleh mempunyai lebih daripada hanya pelbagai aksara, kita boleh mempunyai pelbagai apa-apa jenis perkara yang kita mahu. Jadi, jika anda ingat dari minggu lepas, Program peringkat umur yang diperkenalkan David benar-benar cepat. Perkara itu kita akan lakukan adalah meminta pengguna untuk integer, yang beberapa orang di dalam bilik. Apabila kita mempunyai integer itu, kami mengisytiharkan array. Notis sintaks kurungan ini. Anda akan mendapatkan digunakan untuk itu. Jadi, kita mengisytiharkan pelbagai integer dipanggil peringkat umur, dan terdapat n integer dalam array ini. Jadi corak ini di sini, int 4 i sama dengan 0, i adalah kurang daripada n, i ditambah plus, yang juga akan menjadi corak yang bahawa anda menjadi sangat digunakan untuk. Kerana itulah cukup banyak bagaimana anda sentiasa akan melelar atas tatasusunan. Jadi ingat bahawa n adalah panjang pelbagai kami. Dan jadi di sini, kami berulang kali meminta untuk umur orang i di dalam bilik. Selepas ini, kami turun, dan untuk apa sahaja sebab sewenang-wenangnya, kita mencetak berapa lama mereka akan menjadi tahun dari sekarang. Dan menjalankan program itu, mari kita membuat peringkat umur, peringkat umur dot slash. Jadi beberapa orang di dalam bilik, katakan ada tiga. Dan berkata, orang pertama ialah 13, seterusnya adalah 26, dan yang terakhir ialah 30. Demikian maka ia akan melelar ke atas tiga orang, mencetak 14, 27, dan 31. Jadi ingat bahawa apabila kita mengisytiharkan pelbagai saiz n, indeks dalam yang pelbagai, array mempunyai nilai-nilai dan indeks 0, 1, 2, sepanjang jalan sehingga n tolak 1. Oleh itu, apabila kita berkata terdapat tiga orang di dalam bilik, dan kami meletakkan di sini lelaran pertama melalui ini gelung, i akan menjadi 0. Jadi dalam indeks 0. Kami memberikan yang pertama umur pengguna memasukkan. Kemudian pada satu depan, kita memasuki kedua n pengguna memasukkan, dan dalam hingga dua, n yang terakhir. Jadi melihat bahawa pelbagai saiz tiga tidak mempunyai apa-apa dalam indeks tiga. Ini tidak sah. Baiklah. Jadi, akan kembali di sini. Jadi sekarang kita telah diuruskan dengan pameran, kita mempunyai beberapa kebiasaan. Sekarang kita akan beralih kepada arahan argumen baris, yang akan menjadi cukup relevan dengan set masalah ini. Jadi sehingga sekarang, setiap kali anda telah diisytiharkan Fungsi utama anda, kami telah berkata tidak sah utama int. Jadi tidak sah hanya bererti bahawa kita tidak lulus mana-mana hujah untuk fungsi ini. Sekarang kita akan melihat utama yang boleh mengambil beberapa hujah. Di sini kita memanggil mereka int argc dan kurungan argv tali. Kurungan, sekali lagi, yang menunjukkan bahawa kita berurusan dengan tatasusunan. Jadi di sini, kurungan tali argv, kami berurusan dengan pelbagai tali. Jadi argc, itu akan menunjukkan berapa banyak hujah-hujah yang kita telah diluluskan untuk program ini. Dan untuk melihat apa yang bermakna, mari kita menutup ini. OK. Jadi sehingga sekarang, kami telah menjalankan setiap program seperti peringkat umur slash dot. Kita boleh juga, pada baris arahan, lalu lulus hujah-hujah, dengan itu istilah, perintah argumen baris. Jadi hujah pertama, hello dunia. Jadi di sini, argc akan tiga. Ia kiraan hujah-hujah pada baris arahan. Argc sentiasa sekurang-kurangnya 1, sejak dot mengurangkan peringkat umur, sendiri, yang diambil kira sebagai salah satu hujah-hujah baris arahan. Kemudian hello adalah yang pertama. Jika peringkat umur slash dot adalah sifar, maka hello adalah yang pertama, dan dunia adalah arahan kedua hujah baris. Jadi argv tali, kita akan lihat, mengandungi tali, tanda palang dot peringkat umur, hello, dan dunia. Dan, dengan permintaan Daud, kita akan memainkan video memperkenalkan itu. [VIDEO MAIN SEMULA] -Sehingga kini dalam program-program kami telah bertulis, kami telah mengisytiharkan utama utama tidak sah sebagai int. Dan selama ini, tidak sah yang mempunyai hanya telah menyatakan bahawa program tidak mengambil apa-apa hujah baris arahan. Dalam erti kata lain, apabila pengguna menjalankan program, dia boleh memberikan arahan argumen baris dengan menulis tambahan perkataan atau frasa selepas program ini menamakan di prom. Nah, jika anda yang anda mahu program anda untuk mengambil hujah baris arahan, satu atau banyak kata-kata itu, kami perlu menggantikan tidak sah dengan beberapa hujah. Jadi mari kita buat itu. Termasuk CS50.h. Termasuk io.h. standard Int utama. Dan kini, bukan tidak sah, saya akan nyatakan satu int dipanggil argc, dan pelbagai rentetan dipanggil argv. Sekarang, argc dan argv adalah hanya konvensyen. Kita boleh dipanggil hujah ini paling apa-apa yang kita mahu. Tetapi apa yang penting ialah argc adalah int kerana, mengikut definisi, adalah akan mengandungi kiraan hujah, yang beberapa perkataan dalam jumlah bahawa pengguna telah ditaip pada beliau segera. argv, sementara itu, vektor hujah, adalah akan benar-benar menjadi pelbagai menyimpan semua kata-kata yang pengguna mempunyai ditaip pada beliau segera. Mari kita teruskan untuk melakukan sesuatu sekarang dengan satu atau lebih daripada hujah baris arahan. Khususnya, mari kita teruskan dan cetak apa sahaja perkataan jenis pengguna selepas nama program ini di prom. Kurungan terbuka. Tutup kurungan. Printf peratus s garis sendeng terbalik dan koma. Dan sekarang saya perlu memberitahu printf apa nilai untuk dimasukkan ke dalam pemegang tempat itu. Saya mahu perkataan pertama yang pengguna mempunyai ditaip selepas nama program ini, dan sebagainya saya akan nyatakan argv kurungan 1, berhampiran kurungan, koma bertitik. Sekarang, mengapa kurungan 1 dan tidak kurungan 0? Nah, ternyata, secara automatik disimpan dalam argv 0 akan menjadi nama sebenar program ini. Jadi perkataan pertama yang jenis pengguna selepas nama program ini adalah, dengan konvensyen, akan menjadi disimpan di dalam argv 1. Sekarang mari kita menyusun dan menjalankan program ini. Buat argv 0, dot slash argv 0. Dan kini perkataan seperti khabar. Enter. Dan kita ada, hello. [END VIDEO MAIN SEMULA] ROB Boden: Baiklah. Menutup itu. Jadi mengambil melihat program yang yang kita hanya diperkenalkan kepada kita, baik, hanya untuk menunjukkan, jika kita cetak argv 0, membuat, kini apa yang ia, argv 0, dot slash argv 0. Jadi, seperti yang dijangkakan, ia mencetak yang menamakan program ini, kerana argv 0 adalah sentiasa akan menjadi menamakan program tersebut. Tetapi mari kita melakukan sesuatu yang sedikit lebih menarik. Jadi dalam masalah yang ditetapkan, anda akan diperkenalkan kepada fungsi ini, atoi. Jadi, apa yang kita gunakan untuk atoi? Itu akan menukar tali untuk integer. Jadi jika saya lulus tali, satu dua tiga, untuk atoi, yang akan menukar yang untuk integer, satu dua tiga. Jadi, kita akan untuk menukar yang pertama arahan hujah baris untuk integer, dan kemudian hanya mencetak integer itu. Jadi, pada asasnya, kita jenis reimplementing getint, hanya integer yang dimasukkan ketika arahan talian dan bukan dalam program ini secara interaktif. Jadi kemudian, menjadikan argv 0, mari kita buat ia di sini, dan tutup itu. Maka, argv 0, dan mari kita memasuki integer, satu dua tiga empat satu dua. Jadi ia akan mencetak integer, satu dua tiga empat satu dua. Terdapat beberapa perihal tersirat untuk atoi yang ia akan berhenti mengambil berat tentang apa-apa di luar watak angka yang sah, tetapi itu tidak mengapa. Jadi apa yang anda fikir berlaku jika saya melakukan ini? Segmentasi bersalah. Jadi mengapa itu? Jika anda melihat kembali pada program kami, kami menukar argv 1, hujah pertama selepas nama program ini, untuk integer. Tetapi tidak ada hujah yang diluluskan selepas nama program ini. Jadi di sini, kita lihat bahawa ini adalah kereta yang program, kerana, jika kita cuba menjalankannya tanpa sebarang hujah, ia hanya akan kemalangan. Jadi satu lagi corak umum yang akan anda lihat adalah sesuatu seperti, jika argc kurang daripada dua, yang menunjukkan bahawa tidak ada sekurang-kurangnya nama program dan hujah pertama, maka kita akan melakukan sesuatu seperti printf, tidak cukup hujah baris arahan. Itu mungkin tidak satu yang baik untuk mencetak, ia mungkin sesuatu, seperti anda perlu memasukkan integer pada baris arahan. Saya hanya akan berakhir di sana. Dan kemudian kembali 1. Jadi ingat bahawa pada akhir kami program, jika kita kembali 0, yang jenis menunjukkan kejayaan. Dan utama juga secara automatik mengembalikan 0 jika anda tidak lakukan. Jadi di sini, kita retuning 1 untuk menunjukkan bahawa itu bukan kejayaan. Dan anda boleh kembali apa sahaja yang anda mahu, hanya, 0 menunjukkan kejayaan, dan apa-apa lagi menunjukkan kegagalan. Jadi mari kita menjalankan versi ini perkara. Jadi sekarang, jika kita tidak memasukkan baris arahan hujah, dengan betul akan memberitahu kita, tidak cukup baris arahan. Tidak menamatkan hukuman itu. Yang lain, jika kita benar-benar lulus satu, ia boleh melengkapkan program ini. Jadi ini adalah bagaimana anda akan menggunakan argc dalam bagi mengesahkan bilangan hujah baris arahan yang sebenarnya berlalu. Jadi mari kita membuat program ini sedikit lebih rumit, dan melihat kedua lelaran perkara. Jadi sekarang, kami tidak hanya mencetak arahan hujah baris pertama. Di sini, kami iterating dari setaraf i int 0, i adalah kurang daripada argc, i ditambah plus, dan percetakan argv, indeks i. Jadi corak ini, sekali lagi, ini adalah sama corak seperti sebelum ini, kecuali sebaliknya memanggil pembolehubah n, kita menggunakan argc. Jadi ini adalah iterating lebih setiap indeks dalam tatasusunan, dan mencetak setiap elemen dalam array yang. Dan sebagainya, apabila kita menjalankan program ini, baik, Saya tidak memasuki mana-mana baris arahan hujah-hujah, jadi ia hanya cetakan nama program. Jika saya memasukkan sekumpulan perkara IA AKAN mencetak satu, masing-masing pada baris sendiri. OK. Jadi mari kita mengambil langkah ini satu lagi. Dan bukannya mencetak setiap hujah pada baris sendiri, mari kita mencetak setiap watak setiap hujah pada baris sendiri. Jadi ingat bahawa argv adalah pelbagai tali. Jadi apa yang adalah rentetan, tetapi pelbagai watak-watak? Ini bermakna bahawa argv merupakan satu pelbagai pelbagai aksara. Jadi mengambil kesempatan daripada itu, mari kita mengabaikan ini buat masa ini. Mari kita mempertimbangkan tali argv 0. Jadi, jika kita mahu membawa setiap watak argv 0 pada baris sendiri, maka saya ingin untuk melakukan corak yang kami selalu, i adalah kurang daripada panjang array, yang di sini, adalah strlen daripada, itu tidak apa yang saya mahu lakukan, tali s sama argv 0. Jadi saya adalah kurang daripada panjang kami pelbagai, yang dalam kes ini adalah satu pameran aksara, i plus plus. Dan sebagainya, seperti yang kita lihat minggu lepas, ia adalah ideal jika kita bergerak di luar yang strlen keadaan, kerana n akan menambah yang strlen s setiap kali kita pergi melalui gelung, dan ia tidak akan berubah-ubah. Oleh itu, kita akan menetapkan ia sama dengan n di sini. OK. Jadi sekarang, kami iterating lebih setiap indeks dalam array. Justeru, jika kita ingin mencetak setiap watak dalam yang pelbagai, peratus c adalah bendera kita mahu menggunakan untuk watak-watak. Dan kini kurungan i akan menjadi tali, watak indeks i, jadi jika tali adalah khabar. maka s 0 akan menjadi h, s kurungan 1 akan e, dan sebagainya. Jadi sekarang kita mahu menggabungkan kedua-dua perkara. Kita ingin mencetak setiap aksara setiap hujah baris arahan. Jadi, kita akan mempunyai yang bersarang untuk gelung. Dan konvensional, kaunter pertama adalah i, seterusnya akan menjadi j, n akan menjadi strlen daripada argv i, i adalah kurang daripada n, i plus plus. Dan kini bukannya percetakan argv i, jadi argv kurungan i akan indeks - yang akan menjadi i-ke-baris arahan hujah, argv i, j akan menjadi watak-j daripada i-ke-hujah. Saya akan menghapuskan ini sehingga di sini sekarang kerana kita meletakkan ia ke dalam gelung itu. Jadi adalah bersamaan dengan setaraf tali s argv i, dan kemudian s kurungan j. Nah, kita tidak perlu untuk mengisytiharkan ini s berubah-ubah. Sebaliknya, kita hanya akan menggabungkan ini dua menjadi apa yang kita telah, argv i, j. SPEAKER 1 [didengar]. ROB Boden: panggilan yang baik. Jadi ini adalah patah. Jika saya benar-benar berlari, kita akan telah sedar ini. Jadi kaunter saya mengambil berat tentang dalam khusus ini untuk gelung adalah j, iterator itu. Jadi, anda akan menghadapi isu-isu, mungkin gelung tak terhingga, jika kita tidak tetap itu. Itulah sebabnya kita juga bercakap mengenai debugging hari ini. OK. Jadi mari kita menjalankan program ini. Dan mari kita sebenarnya menambah printf yang berasingan di sini yang hanya akan mencetak garis yang lain, kerana ini bermakna apabila kita menjalankan program ini, akan ada kosong garis di antara setiap watak setiap arahan hujah baris. Nah, kita akan melihat apa yang bermakna. Oop. Mendapat beberapa bug. Ralat tersirat mengisytiharkan fungsi perpustakaan strlen. Jadi kembali ke dalam program kami, saya terlupa untuk hash termasuk string.h. Jadi string.h akan menjadi fail header yang mengisytiharkan fungsi strlen. OK, ia menyusun. Sekarang, mari kita menjalankannya. Jadi hanya itu. Ia akan mencetak kami nama program, hello dunia. Ia akan mencetak setiap perkara, setiap watak, di laluan sendiri. OK. Jadi mari kita benar-benar mengambil ini satu langkah ke hadapan. Dan bukannya menggunakan string.h, mari kita berfikir tentang bagaimana kita akan melaksanakan kita sendiri fungsi strlen. Jadi saya akan segera memberikan tandatangan fungsi. Jadi mari kita memanggil my_strlen, dan ia akan mengambil rentetan sebagai hujah, dan kami menjangkakan untuk kembali panjang tali itu. Jadi, mana lelaki itu? Ya. OK. Jadi ingat daripada penurunan sebelum ini bahawa juga dari minggu lepas, bahawa pelbagai watak-watak, baik, tali, jadi mari kita katakan ini adalah rentetan s kami. Jadi, jika s adalah tali, hello, maka, H-E-L-L-O, dalam ingatan, yang akan berkenaan, dan kemudian garis sendeng terbalik ini 0 watak. Jadi bagaimana kita mendapatkan panjang s? Nah, silap mata tersebut mencari ini refused 0 watak, batal ini terminator. Jadi algoritma Adakah akan menjadi sesuatu yang seperti beberapa watak-watak yang cukup bahawa - mari kita tangan ini mewakili beberapa kaunter, mari kita memanggilnya panjang int ini. Jadi, bermula dari di sini, kami akan melelar atas tali kami. Jadi watak pertama, ia H, dan ia tidak kembali mengurangkan 0, jadi panjang ialah 1. Melelar dengan watak yang akan datang, E, dan ia tidak garis sendeng terbalik 0. Length ialah 2. L, 3. L, 4. O, 5. Dan akhirnya, kita mencapai garis sendeng terbalik 0, dan justeru itu, baik, rentetan ini berakhir. Jadi mari kita kembali 5. Jadi sebenarnya melaksanakan bahawa, pertama, n panjang saya sama dengan 0, tangan kanan saya. Dan kita akan melelar - SPEAKER 1 [didengar] ROB Boden: Oh, menembak. Panggilan yang baik. Boom. Jadi n panjang sama dengan 0. Jadi sekarang, panjang manakala s tidak sama dan kemudian, garis sendeng terbalik 0. Jadi ingat, garis sendeng terbalik ini 0, ia adalah satu watak sebenar, dan ia menunjukkan akhir tali. Sama seperti, juga, garis sendeng terbalik n adalah watak sebenar. Garis sendeng terbalik 0 akan menunjukkan akhir tali kami. Saya tidak mahu meletakkan bahawa di sana. Dan manakala s diindeks oleh panjang tidak sama dengan null, maka kita hanya akan kenaikan panjang. Jadi kemudian, pada akhir program kami, panjang akhirnya akan adalah 5 dalam kes ini. Dan kita akan kembali panjang. OK. Jadi sekarang turun di sini, saya tidak melakukan my_strlen. Mari kita menyusun ia memastikan semuanya berjalan dengan lancar. Sedang saya lakukan dalam 2? Atau bahawa 1? Yang perlu dilakukan. Baiklah. Jadi ini adalah argv 2. Kerja seperti yang dijangkakan, walaupun adalah bahawa yang saya lakukan dalam? Ya. OK. Versi perkara tidak mempunyai garis printf baru selepas itu, tetapi ia tidak membuat apa-apa perbezaan. OK. Jadi bekerja seperti yang diharapkan. Sekarang kita juga boleh menggabungkan langkah ini satu lanjut, di mana notis di sini, baik, pertama, kita merebut strlen daripada argv i, dan kemudian kita iterating lebih setiap aksara dalam rentetan itu. Jadi, daripada melakukan itu, bagaimana jika kita hanya menggabungkan logik ini menunggu sehingga kita mencapai garis sendeng terbalik 0 betul ke dalam ini untuk gelung? Jadi melelar manakala argv i, j tidak tidak sama garis sendeng terbalik 0. Jadi mari kita menjalankannya pertama. Baiklah. Jadi di sini, keadaan ini berkata - mari kita jelas bahawa. Jadi sekarang, biarlah ini menjadi argv kami. Oleh itu, apabila saya hanya berlari program yang sebelum ini, argv adalah pelbagai tali. Dan sebagainya, jika saya menjalankannya dengan dot slash argv 2, hello dunia, maka argv yang itu sendiri adalah panjang 3, untuk argv sifar, hello, dan dunia. Dan di dalam setiap indeks ini adalah, sendiri pelbagai, di mana ini akan dot, ini akan menjadi palang, saya tidak tahu jika itu adalah arah yang betul, saya tidak fikir ia adalah. A-R-V sengkang, memerlukan lebih banyak ruang. Mari kita potong pelbagai ini. Dash 0, dan kemudian garis sendeng terbalik 0 A-R-V. Dan kemudian dalam kucar-kacir akan khabar. Katakan, H-E garis sendeng terbalik 0. Dan akhirnya, W-O garis sendeng terbalik 0. Jadi algoritma yang kita hanya menulis, yang bersarang untuk gelung, apa yang mereka melakukan iaitu, kita mula-mula mempunyai menangani i dan kemudian j. Ini akan menjadi lebih mudah dengan kod pada skrin, Mari kita kembali kepada ini. OK. Jadi notis bahawa saya adalah iterator itulah iterating atas setiap arahan hujah baris. Dan j adalah iterating iterator yang atas setiap watak dalam yang hujah baris arahan. Jadi apa printf terdalam ini melakukan adalah, kami telah printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, tetapi sekarang, argv 0 7 akan sama garis sendeng terbalik 0. Jadi maka kita keluar yang bagi gelung, dan sekarang aku iterates kepada 1. Dan sekarang kita akan cetak argv 1 0, argv 1 1 - baik, sekarang, sejak saya memotong hello pendek, argv 1 2 sekali lagi akan menjadi garis sendeng terbalik 0. Dan sebagainya, kenaikan i dan terus, dan sebagainya, sehingga kita mencetak semua dunia, dan mereka adalah tiga baris arahan hujah-hujah, dan kami akan keluar daripada gelung paling luar, dan selesai program kami. OK. Jadi mari kita kembali di sini. Jadi, anda akan mendapat beberapa kebiasaan dengan hujah baris arahan mengenai perkara ini masalah tertentu ditetapkan. Sekarang, debugging. Jadi anda mungkin telah terpaksa melakukan beberapa debugging dengan anda sebelum ini masalah ditetapkan. Dan satu cara yang amat mudah debugging, pertama, mari kita lihat satu program kereta. Nah, berjalan melalui program ini, kita akan meminta pengguna untuk integer, merebut integer itu, dan kemudian, sewenang-wenangnya, kita mempunyai gelung sementara hanya akan SUSUTAN i sehingga ia sama dengan 10. Mari kita hanya menganggap saya memasuki integer lebih besar daripada 10. Jadi SUSUTAN i sehingga ia sama dengan 10. Dan maka kita mempunyai gelung manakala bahawa, sementara i tidak sama 0, kita akan SUSUTAN i dengan 3. Jadi jika anda melihat niat bug yang di sini, ia adalah bahawa ini akan SUSUTAN i untuk 10, dan maka ini gelung dan suasana susutan i dari 10, 7, 4, 1, kepada negatif 2, kepada negatif 5, dan sebagainya, ke infiniti negatif, kerana i akan tidak pernah benar-benar sama dengan 0. Dan kemudian pada akhir program ini, kita mempunyai fungsi foo yang adalah berlaku cetak bahawa i. Jadi ini adalah program yang singkat dan remeh, dan pepijat adalah jelas, terutamanya selepas saya hanya berkata apa bug itu. Tetapi niat di sini adalah, baik, mungkin ini sebenarnya kelihatan seperti beberapa anda penyelesaian dari tamak daripada yang sebelumnya masalah ditetapkan, dan mungkin anda mempunyai beberapa gelung tak terhingga dalam program anda, dan anda tidak mempunyai idea apa yang menyebabkan ia. Jadi teknik debugging sangat berguna adalah untuk hanya menambah printfs seluruh kod anda. Jadi di sini saya ingin printf di luar gelung sementara pertama. Dan di sini saya ingin printf yang, dan saya hanya akan mencetak i. Saya juga akan lakukan pertama manakala gelung, i. Di luar, kedua manakala gelung. Sekali lagi, di dalam mencetak dari sini, nilai i. Dan mari kita berjalan ini. Debug slash Jadi titik. Masukkan integer. Mari kita buat 13. Dan ledakan. Kita melihat bahawa kita adalah gelung tak terhingga bahagian dalam gelung manakala yang kedua. Jadi sekarang kita tahu apa bug itu. Tetapi printf debugging adalah betul-betul hebat, tetapi apabila program anda mendapatkan lebih lama dan lebih rumit, terdapat penyelesaian yang lebih canggih untuk mendapat perkara bekerja. Jadi mari kita membuang semua printfs ini. Dan mari kita memastikan saya tidak memecahkan apa-apa. OK. Jadi program ini kita akan untuk memperkenalkan dipanggil GDB, untuk GNU Debugger. Well, sebenarnya, mari kita keluarkan debug untuk yang kedua, dan membuat debug lagi. Well, sebenarnya pertama, satu pengajaran yang baik dalam hujah baris arahan. Perhatikan bahawa perintah dentang ini yang menyusun semuanya yang diluluskan pada baris arahan, ini hujah baris arahan. Jadi bagaimana anda akan menggunakan hujah baris arahan, seperti yang kita lakukan sebelum ini, dan kerana anda akan di Serangga 2, itu bagaimana dentang menggunakan mereka. Jadi melihat bahawa ini bendera pertama, sengkang ggdb3, apa itu mengatakan iaitu, dentang, anda perlu menyusun fail ini dengan niat yang kita akan akhirnya perlu debug ia. Jadi selagi anda mempunyai bendera yang, maka kita boleh GDB debug. Dan ia akan membuka GNU Debugger. Jadi, terdapat banyak arahan yang anda perlukan untuk mendapatkan digunakan untuk. Yang pertama yang anda akan mungkin segera perlukan adalah Run. Jadi apa yang Jalankan akan lakukan? Ia akan memulakan program kami. Jadi berjalan, program bermula, program ini meminta kita untuk integer, 13. Dan kemudian ia gelung tak terhingga sebagai dijangkakan, kecuali saya dibuang printfs, jadi kita tidak melihat bahawa. Keluar seperti biasa. Oh. Ia mungkin bahawa ia dibalut semua jalan di seluruh, kembali kepada - mengabaikan itu. Andaikan ia tidak keluar seperti biasa. Ada jawapan yang rumit untuk itu. Jadi sekarang, itu bukan sangat berguna. Jadi hanya menjalankan program kami dalam penyahpepijat ini tidak membantu kita dalam mana-mana cara, kerana kita boleh sahaja selesai dot slash debug dari luar GDB. Jadi perintah satu yang anda akan mungkin - dan saya akan berhenti ini. Kawalan-d atau berhenti, kedua-dua kerja. Jadi mari kita membukanya semula. Arahan lain yang mungkin anda akan dengan serta-merta mahu membiasakan diri adalah Break. Jadi kami akan memecahkan di utama sekarang, dan kemudian saya akan menjelaskan bahawa. Nah, di sini kita lihat kita menetapkan takat putus yang di baris ini dalam debug.c. Jadi apa cara rehat ialah apabila saya menaip jangka, program ini akan terus berjalan sehingga Saya mencecah takat putus a. Oleh itu, apabila saya mencecah jangka, program ini bermula, dan kemudian ia memecah sebaik sahaja ia memasuki fungsi utama. Cuti utama akan menjadi sesuatu anda cukup biasa lakukan. Dan kini, untuk memperkenalkan anda untuk lebih banyak arahan. Perhatikan di sini, bahawa ia mengatakan kita memecahkan di garisan 11, yang merupakan printf, masukkan integer. Jadi arahan Seterusnya akan menjadi bagaimana kita pergi ke baris seterusnya kod. Ini akan membolehkan kita untuk melangkah melalui talian program kami dengan talian. Jadi akan datang. Sekarang talian 12, kita akan untuk mendapatkan integer. Seterusnya. Dan jika anda hanya tekan Enter sekali lagi, ia akan buat semula perkara terakhir yang anda lakukan. Jadi, saya tidak perlu menaip seterusnya setiap kali. Jadi memasukkan integer, 13. Jadi sekarang, talian 14, manakala i adalah lebih besar daripada 10, dan saya akan dilakukan seterusnya. Dan kita lihat kita akan SUSUTAN i. Jadi kita akan SUSUTAN i lagi. Jadi sekarang, satu lagi berguna arahan adalah Cetak. Jadi Cetak akan mencetak nilai pembolehubah. Mari kita membawa keluar nilai pembolehubah i. Mari kita mencetak i. Ia akan berkata i ialah 11. Sekarang kita Seterusnya lagi semasa i adalah lebih besar daripada 10. Jadi saya masih lebih besar daripada 10, kerana ia 11. i tolak tolak. Mari kita mencetak i lagi. Seperti yang dijangka, ia 10. Jadi sekarang, akan datang. Ia akan kembali ke keadaan, i adalah lebih besar daripada 10, tetapi saya kini 10, jadi ia tidak lebih besar daripada 10, jadi kami menjangkakan ia jatuh daripada gelung sementara. Dan sekarang kita di bawah yang baris kod. Dan hal yang lain, Senarai, hanya akan untuk memaparkan sebelumnya dan seterusnya beberapa baris kod, dalam kes anda kehilangan diri sendiri. Jadi kita hanya keluar gelung selama ini, dan kini kita telah memasuki ini manakala gelung, line 18. Jadi sementara i tidak sama 0. Dan, seterusnya, saya sama i tolak 3, dan kita akan notis, ini hanya akan terus berterusan. Dan kita boleh mencetak i. Setiap arahan jenis mempunyai jalan pintas. Jadi p singkat untuk Cetak. Oleh itu, kita boleh p i. Hanya terus memegang n, atau terus melakukan Seterusnya. Cetak i lagi. Anda lihat sekarang ia negatif 167. Jadi, ini akan berterusan selama-lamanya, tetapi tidak benar-benar selama-lamanya, kerana anda hanya melihat, ia sebenarnya akan berakhir pada satu ketika. Jadi yang Bermula GDB. Tetapi mari kita buat satu lagi perkara dalam GDB. Uh, debug. Jadi, dalam kes ini, yang gelung tak terhingga kebetulan berada di dalam fungsi utama. Dan buat masa ini, hanya menerima bahawa bahawa saya akan bergerak gelung yang tidak terhingga ke dalam fungsi foo. Hanya ingat bahawa, pada akhir ini program, baik, ini adalah asalnya memanggil foo, yang hanya akan mencetak i. Tetapi sekarang kita memanggil foo, yang merupakan akan SUSUTAN i sehingga ia 0, dan kemudian mencetak ubah itu. OK. Jimat itu. Buat debug. Dan kini, Pra-Pemasangan debug. OK. Jadi, jika saya hanya Jalankan maka saya tidak akan dapat benar-benar melangkah melalui saya program barisan oleh talian. Jadi mari kita memecahkan di utama, dan kemudian taip jangka. Oleh itu, pergilah melalui ini, printf, masukkan integer, dapatkan integer, 13. Jadi, kita akan menyimpan decrementing sehingga i adalah lebih besar daripada 10. Kemudian kita akan jatuh melalui manakala gelung, dan sampai ke garisan - mari kita buka dalam tetingkap berasingan. Oleh itu, kita decremented sehingga i tidak lagi lebih besar daripada 10, dan kemudian kita dipanggil fungsi, foo. Jadi apa yang berlaku sebaik sahaja saya mencecah fungsi foo, baik, saya dipanggil foo, dan maka saya tidak lagi mempunyai kawalan ke atas GDB. Jadi sebaik sahaja saya mencecah Seterusnya di garisan ini, perkara berterusan sehingga ini berlaku, di mana program ini keluar apabila - menganggap ia tidak wujud akhirnya. Anda melihat ia berhenti seketika untuk sedikit walaupun. Jadi mengapa saya kehilangan kawalan ke atas program ini pada ketika itu? Nah, apabila saya menaip depan, yang pergi ke baris seterusnya literal kod yang akan melaksanakan. Jadi selepas line 21, baris seterusnya kod yang akan melaksanakan adalah talian 22, yang, keluar dari utama. Jadi, saya tidak mahu hanya pergi ke baris seterusnya kod. Saya mahu pergi ke dalam fungsi, foo, dan kemudian juga melangkah melalui mereka baris kod. Jadi untuk itu, kita mempunyai alternatif. Mari kita berhenti itu lagi. Cuti utama. Uh, 1, seterusnya, seterusnya, 13, akan datang, seterusnya, seterusnya, berhati-hati, sebelum kita mencapai garis foo. OK. Jadi sekarang, kami di talian 21, di mana kita panggil foo. Kami tidak mahu menaip seterusnya, kerana itu hanya akan memanggil fungsi foo, dan pergi ke baris seterusnya kod. Apa yang kita mahu untuk digunakan ialah Step. Jadi ada perbezaan antara Langkah dan Seterusnya, di mana Langkah langkah ke dalam berfungsi, dan Seterusnya pergi lebih fungsi. Ia hanya melaksanakan keseluruhan daripada fungsi dan menyimpan berterusan. Jadi Langkah akan membawa kita ke dalam majlis itu, foo. Dan kita lihat di sini, sekarang, kami kembali di gelung selama ini itulah, dalam teori, akan terus selama-lamanya. Dan jika anda memukul langkah, apabila ia tidak juga fungsi untuk panggilan, maka ia sama dengan Seterusnya. Jadi ia hanya apabila anda berada di garis yang memanggil fungsi yang Langkah akan berbeza daripada Seterusnya. Jadi Langkah akan membawa kita di sini. Langkah, langkah, langkah, langkah, langkah, langkah, dan kita akan hanya gelung tak terhingga selama-lamanya. Jadi, anda mungkin akan digunakan untuk bahawa anda cara mengenal pasti gelung tak terhingga, adalah hanya memegang ini Masukkan utama untuk melihat di mana anda tersekat. Ada cara yang lebih baik untuk berbuat demikian, tetapi buat masa ini, adalah betul-betul yang mencukupi. Dan segi gaya, untuk menepati Gaya 50, yang perlu saya telah melakukan ini. OK. Jadi satu arahan lepas untuk memperkenalkan. Nah, mari kita GDB debug masuk Jadi, daripada melanggar di utama, sekiranya saya tahu fungsi foo yang juga merupakan masalah, maka saya boleh mempunyai hanya berkata, pecah di foo, sebaliknya. Katakan saya memecahkan di kedua-dua utama dan foo. Jadi, anda boleh menetapkan seberapa banyak titik putus yang anda mahu. Apabila saya menaip jangka, ia akan berhenti di - aduh, mari kita susun semula, kerana Saya menukar sesuatu. Anda akan melihat ini talian, Amaran, sumber fail adalah lebih terkini daripada laku. Ini bermakna bahawa saya hanya pergi di sini dan menukar ini untuk menepati Gaya 50, tetapi saya tidak susun semula program ini. Jadi GDB membuatkan saya sedar itu. Saya akan berhenti, membuat debug lagi, memukul Pra-Pemasangan debug. OK. Jadi sekarang, kembali kepada apa yang saya lakukan. Cuti utama, rehat foo. Sekarang, jika saya menjalankan program ini, jadi ia akan berterusan sehingga terkena takat putus. Takat putus yang berlaku kepada menjadi orang pertama di utama. Sekarang, bukan melakukan seterusnya, seterusnya, seterusnya, akan datang, akan datang, sehingga saya memukul foo, saya boleh menaip terus, yang akan terus sehingga anda mencecah takat putus seterusnya. Saya perlu memasukkan integer pertama. Teruskan akan berterusan sehingga saya melanda takat putus seterusnya, iaitu bahawa fungsi foo. Jadi Run akan berjalan sehingga anda mencecah takat putus, tetapi anda hanya taip air semasa anda memulakan program ini, dan kemudian, selepas itu, ia terus. Jika saya hanya melakukan memecahkan utama dan kemudian berlari, ia akan memecahkan di utama, dan kemudian teruskan. Oleh kerana saya tidak mempunyai titik rehat di foo, memasukkan integer, maka sekarang saya tidak akan memecahkan di foo. Ia hanya akan terhingga gelung sehingga itu. OK. Jadi, itu Pengenalan GDB. Anda perlu mula menggunakannya dalam set masalah anda. Ia boleh sangat membantu untuk mengenal pasti bug. Jika anda benar-benar adil, barisan-line, pergi melalui kod anda, dan bandingkan apa yang sebenarnya berlaku dengan apa yang anda harapkan berlaku, maka ia cukup sukar untuk terlepas pepijat anda. OK. Jadi minggu lepas David dibesarkan ini barangan kriptografi rahsia-utama bagi kali pertama, di mana kita tidak mahu kata laluan hanya disimpan pada kami komputer dalam beberapa fail teks biasa, di mana seseorang boleh datang dan hanya membukanya dan membacanya. Sebaik-baiknya, mereka akan disulitkan dalam beberapa cara. Dan dalam Set Masalah 2, anda akan berurusan dengan satu kaedah penyulitan, atau, baik, dua kaedah, tetapi mereka tidak begitu besar. Jika anda edisi penggodam, anda juga akan berhadapan dengan decrypting beberapa perkara. Jadi isunya sekarang ialah, baik, walaupun kita mempunyai penyulitan kuat algoritma di dunia, jika anda memilih kata laluan terutamanya miskin, maka ia tidak akan membantu anda sangat banyak, kerana orang masih akan dapat mencari penyelesaiannya. Walaupun melihat tali disulitkan dan ia kelihatan seperti menggagalkan sampah yang bermaksud apa-apa kepada mereka, jika mereka masih hanya perlu mencuba beberapa kata laluan untuk mencari penyelesaiannya, maka anda tidak begitu selamat. Jadi menonton video yang menyatakan perkara itu. [VIDEO MAIN SEMULA] Who, anda yg sangat jahat. Apa yang berlaku? Apa yang anda lakukan untuk anak perempuan saya? -Izinkan saya untuk memperkenalkan cemerlang pakar bedah plastik muda, Dr Phillip Schlotkin, hidung yang paling besar lelaki pekerjaan di seluruh alam semesta, dan Beverly Hills. -Anda Mulia. -Hidung kerja? Saya tidak faham. Dia sudah mempunyai pekerjaan hidung. Ia adalah manis enam belas hadir. -No. Ini bukan apa yang anda fikirkan. Ia lebih, lebih buruk. Jika anda tidak memberi saya gabungan untuk perisai udara, Dr Schlotkin akan memberi anak perempuan anda kembali hidung lama beliau. -No. Di mana anda mendapatkan itu? -Baiklah. Saya akan memberitahu. Saya akan memberitahu. Tidak, ayah. Tidak, anda tidak perlu. -Kau betul, sayang saya. Saya akan terlepas hidung baru anda. Tetapi saya tidak akan memberitahu dia gabungan itu, tidak kira apa. -Baiklah. Dr Schlotkin, lakukan yang paling teruk anda. -Saya keseronokan. [ALAT YANG diasah] -No. Tunggu. Tunggu. Saya akan memberitahu. Saya akan memberitahu. -Saya tahu ia akan bekerja. Baiklah. Berikan kepada saya. -Gabungan adalah satu. -One. -One. -Dua. -Dua. -Dua. -Tiga. -Tiga. -Tiga. -Empat. -Empat. -Empat. -Lima. -Lima. -Lima. -Jadi gabungan adalah satu, dua, tiga, empat, lima. Itu gabungan yang paling bodoh Yang pernah saya dengar dalam hidup saya. Itulah jenis perkara yang bodoh kali ini kepada bagasinya. -Terima kasih, Duli anda. -Apa yang anda lakukan? -I dimatikan dinding. -Tiada anda tidak. Anda dimatikan keseluruhan filem. -Saya mesti menekan butang yang salah. -Nah, meletakkannya kembali. Letakkan filem semula. -Ya, tuan. Ya, tuan. -Mari kita pergi, Arnold. Marilah, Gretchen. Sudah tentu, anda tahu saya akan masih perlu menghantar bil kepada anda untuk ini. [END VIDEO MAIN SEMULA] ROB Boden: Baiklah. Jadi sekarang kita sudah bercakap tentang keselamatan dalam beberapa cara, bagus poster filem sedikit, jadi baru-baru ini hari, isu-isu ini dengan NSA memantau segala-galanya. Ia boleh menjadi sukar untuk merasa seperti anda mempunyai beberapa jenis privasi yang Dunia dalam talian, walaupun saya tidak dapat memberitahu anda kebanyakan butiran PRISM. Jadi bergerak di luar PRISM, kita tidak akan yang akan bercakap tentang itu, kini berfikir tentang komputer riba anda. Jadi di sini, saya ingin beralih ke akaun sebenar saya, dengan penguin kecil saya. Jadi saya mempunyai satu set kata laluan, dan yang kata laluan adalah apa yang saya mahu ia menjadi. Tetapi ingat bahawa apa yang saya pembalakan dengan, jadi login ini segera, adalah beberapa program. Ia adalah beberapa program yang ditulis oleh orang tertentu. Dan sebagainya, orang itu, jika mereka terutamanya yang berniat jahat, mereka boleh telah berkata, baiklah, jadi jika kata laluan yang yang saya masukkan adalah sama dengan saya kata laluan sebenar, atau ia sama untuk beberapa kata laluan khas - David adalah hebat atau sesuatu - biarkan mereka masuk Jadi seorang pengaturcara berniat jahat boleh mempunyai akses kepada semua Macs anda, atau Windows, atau apa-apa. Supaya tidak banyak kebimbangan, kerana, Maksud saya, ini adalah program login yang yang dihantar dengan OS X, beratus-ratus atau beribu-ribu orang mempunyai dikaji semula kod ini. Justeru, jika, dalam kod anda di tempat, anda mengatakan jika string ini sama setaraf David adalah hebat, login, maka seseorang dalam akan menjadi, seperti, tunggu. Ini tidak betul. Ini tidak berada di sini. Jadi, itu satu cara kita mendapatkan benda-benda menjadi jenis yang selamat. Tetapi berfikir tentang walaupun program yang anda menulis. Katakan anda menulis program log masuk. Jadi ini program login yang anda menulis, jadi jelas, anda baik yang programmer. Anda tidak akan meletakkan apa-apa yang berniat jahat jika x sama sama David adalah hebat ke dalam kod anda. Tetapi program ini, apa yang anda gunakan untuk menyusun program ini? Sesuatu seperti gemerincing. Jadi apa jika orang yang berlaku kepada menulis dentang khas bingkai dalam dentang sesuatu seperti, jika saya menyusun program login, kemudian masukkan kod ini ke dalam program login yang mengatakan, jika x sama sama David adalah hebat? Jadi tidak cukup lagi, tetapi kita mempunyai yang sama mengeluarkan sini, di mana bunyi berdering, baik, beribu-ribu, jika tidak beribu-ribu orang, telah melihat dentang, mempunyai melihat garis-garis yang kod dan berkata, semua betul, tiada apa-apa yang tidak baik di sini. Jelas sekali, tidak ada yang melakukan apa-apa ini berniat jahat. Tetapi apa yang dilafaz sendiri, seperti, bagaimana jika saya menyusun bunyi berdering? Bagaimana jika saya mempunyai beberapa pengkompil yang menyusun dentang yang memasukkan ke dalam dentang hack ini khusus yang menyatakan bahawa, semua betul, apabila saya menyusun bunyi berdering, maka laku saya mendapatkan harus melihat khas bahagian dalam program log masuk dan memasukkan kata laluan ini, sama setaraf Dave adalah hebat? Jadi ingat bahawa pengkompil anda sendiri perlu disusun pada satu ketika. Jadi, jika apa yang anda pilih untuk menyusun dentang dengan, itu sendiri adalah berniat jahat, maka anda boleh diskru keseluruhannya ke bawah baris. Jadi di sini, kita mempunyai Ken Thompson dan Dennis Ritchie. Jadi ini adalah satu gambar ikonik. Dennis Ritchie adalah di sebelah kanan. Beliau adalah utama yang - cukup banyak menulis C. Jadi, anda boleh mengucapkan terima kasih kepada kelas ini. Ken Thomson adalah di sebelah kiri. Kedua-dua mereka pada dasarnya menulis UNIX. Baik, mereka merupakan penyumbang utama dalam UNIX. Terdapat beberapa orang lain. Jadi Ken Thompson, pada satu ketika, dia menang Anugerah Turing. Dan anugerah Turing, saya sentiasa mendengar ia dirujuk dengan cara ini, ia adalah Hadiah Nobel sains komputer. Jadi di Anugerah Turing, beliau perlu memberikan ucapan penerimaannya. Dan dia memberikan ucapan ini sangat terkenal sekarang, dipanggil Harvey pada mempercayai Amanah, yang kami telah dikaitkan pada laman web kursus. Dan dalam ucapan ini, beliau berkata, semua betul, jadi saya menulis UNIX, dan kini semua anda orang yang menggunakan UNIX. Sekarang, ingat hari ini bahawa Linux adalah keturunan langsung UNIX. OS X secara langsung menggunakan UNIX. Windows tidak begitu banyak, tetapi banyak idea diambil dari UNIX. Jadi ia naik ke pentas dan berkata, semua betul, saya menulis UNIX. Dan hanya jadi anda semua tahu, saya dapat log masuk ke setiap satu pun dari komputer anda. Oleh kerana saya meletakkan salah satu ini khas jika x sama sama Ken Thomson adalah hebat, maka saya dibenarkan untuk log masuk. Jadi orang-orang seperti, baik, Bagaimana kamu berbuat demikian? Kita melihat program login dan apa-apa yang ada di sana. Dia seperti, baik, saya diubahsuai pengkompil untuk log masuk program login supaya program login kini mempunyai yang x sama sama Ken Thompson adalah hebat. Dan mereka berkata, baik, yang tidak benar. Kami sedang mencari pengkompil, dan pengkompil tidak mempunyai baris kod seperti itu. Dia seperti, OK, tetapi apakah anda menyusun pengkompil dengan? Dan mereka berfikir, dan dia, seperti, baik, Saya salah seorang yang memberikan anda pengkompil anda menggunakan untuk menyusun pengkompil, jadi anda menyusun pengkompil, yang itu sendiri adalah berniat jahat, dan akan memecahkan program log masuk. Jadi, pada asasnya, pada ketika itu, ada ada cara anda boleh melihat sumber kod program login untuk melihat apa yang salah. Anda tidak dapat melihat di kod sumber pengkompil untuk melihat apa yang salah. Anda perlu memandang mesin kod, perduaan sebenar pengkompil disusun untuk melihat, menunggu, ini baris kod tidak berada di sini. Tetapi Ken Thompson mengambil ia satu langkah lagi dan berkata, baik, terdapat program-program khas yang benar-benar membantu anda membaca binari program, dan sebagainya jika seseorang menggunakan program itu untuk membaca perduaan, mereka akan melihat ini baris kod. Beliau diubahsuai program-program untuk dikatakan, semua betul, jika anda sedang mencari di pengkompil, tidak menunjukkan khusus ini set binari. Demikian maka anda perlu mengambil langkah yang lagi dan pada dasarnya, yang boleh memberi pelbagai peringkat diambil tdk langsung, dan pada satu ketika, tidak ada sebenarnya akan memeriksa. Jadi moral cerita ini adalah, anda tidak akan menulis Dentang di dalam kelas ini. Anda akan menggunakan mendaki Dentang banyak dalam kelas ini. Untuk semua yang anda tahu, bunyi berdering adalah berniat jahat program yang mensabotaj setiap program tunggal anda pernah disusun. Dan untuk meninggalkan anda pada yang sangat menyenangkan maklum, jumpa pada hari Rabu. [Tepuk tangan] SPEAKER 2: Pada CS50 seterusnya. SPEAKER 3: Jangan anda berani mengatakan bahawa. Anda boleh melakukan ini. Anda telah melakukan sebelum ini, anda boleh melakukan ini hari ini, anda boleh melakukan ini esok. Anda telah melakukan ini selama bertahun-tahun. Hanya pergi ke sana dan melakukan ini. Anda boleh melakukan ini. [MUZIK Bermain]