>> [MUSIC PLAYING]
>> ROB BODEN: Baiklah.
Jadi, hal pertama yang pertama, video dari wajah akrab.
>> [VIDEO PLAYBACK]
>> Baiklah.
Ini adalah CS50, dan ini adalah awal minggu ketiga.
Maaf aku tidak bisa berada di sana dengan Anda hari ini, tetapi izinkan saya untuk memperkenalkan
CS50 sendiri Rob Boden.
>> [END VIDEO PEMUTARAN]
>> [Tepuk Tangan DAN CHEERS]
>> ROB BODEN: The filmografi di video yang fantastis.
Baik.
Jadi pertama, ada makan siang yang lain.
Ini besok pukul 01:15.
Tidak ada makan siang Jumat ini.
Hal ini dengan Quora.
Dan Tommy belum datang, tapi salah satu orang-orang ada mantan kepala CF,
Tommy McWilliam.
Jadi dia orang yang menyenangkan.
Anda harus datang.
>> Baik.
Jadi minggu lalu, kami mulai berantakan tentang apa string sebenarnya.
Kami sudah tahu sejak awal bahwa itu adalah urutan karakter.
Tapi minggu lalu, kami menyelidiki fakta bahwa apa yang sebenarnya urutan
karakter, baik, kita sekarang memiliki array karakter.
Dan kita tahu bahwa string, itu sebuah array karakter, di akhir,
kita memiliki null byte khusus, ini backslash 0, yang menunjukkan akhir
string.
>> Jadi string adalah array dari karakter, tapi kita bisa memiliki lebih dari
hanya sebuah array karakter, kita dapat memiliki sebuah array dari setiap
jenis hal yang kita inginkan.
Jadi, jika Anda ingat dari minggu lalu, Program Abad bahwa David diperkenalkan
benar-benar cepat.
Sehingga hal pertama kita akan lakukan adalah meminta pengguna untuk integer,
jumlah orang di dalam ruangan.
Setelah kita memiliki integer yang, kita mendeklarasikan array.
Perhatikan sintaks braket ini.
Anda akan terbiasa dengan itu.
>> Jadi kita mendeklarasikan sebuah array bilangan bulat disebut usia, dan ada n
integer dalam array ini.
Jadi pola ini di sini, ini 4 int i sama dengan 0, i kurang dari n, i ditambah
ditambah, yang juga akan menjadi pola bahwa Anda mendapatkan sangat digunakan untuk.
Karena itu cukup banyak bagaimana Anda selalu akan iterate atas array.
Jadi ingat bahwa n adalah panjang array kita.
Dan di sini, kita berulang kali meminta untuk usia orang i di dalam ruangan.
>> Setelah ini, kita turun, dan untuk apa pun Alasan sewenang-wenang, kita kemudian
mencetak berapa lama mereka akan menjadi satu tahun dari sekarang.
Dan menjalankan program itu, mari kita membuat usia, dot slash usia.
Jadi jumlah orang di dalam ruangan, katakanlah ada tiga.
Dan mengatakan, orang pertama adalah 13, berikutnya adalah 26, dan yang terakhir adalah 30.
Jadi itu akan iterate atas tiga orang, mencetak 14, 27, dan 31.
>> Jadi ingat bahwa ketika kita mendeklarasikan array berukuran n, indeks dalam
array, array memiliki nilai-nilai dan indeks 0, 1, 2, sepanjang jalan
sampai dengan n dikurangi 1.
Jadi ketika kita mengatakan ada tiga orang di dalam ruangan, dan kita masukkan ke dalam sini
iterasi pertama melalui ini lingkaran, saya akan menjadi 0.
Jadi dalam indeks 0.
Kami menugaskan pertama usia pengguna memasukkan.
Kemudian pada yang berikutnya, kita memasuki kedua n pengguna memasukkan, dan di
di samping dua, n terakhir.
>> Jadi melihat bahwa berbagai ukuran tiga tidak memiliki apa-apa
dalam indeks tiga.
Hal ini tidak berlaku.
Baik.
Jadi, akan kembali ke sini.
Jadi sekarang kita sudah berurusan dengan array, kami memiliki beberapa keakraban.
Sekarang kita akan beralih ke perintah argumen baris, yang akan menjadi
cukup relevan dengan masalah set ini.
>> Jadi sampai sekarang, setiap kali Anda sudah menyatakan fungsi utama Anda, kami telah
kata int void main.
Jadi batal hanya berarti bahwa kita tidak melewati setiap
argumen untuk fungsi ini.
Sekarang kita akan melihat utama yang dapat mengambil beberapa argumen.
Di sini kita menyebutnya int argc dan benang kurung argv.
Tanda kurung, sekali lagi, menunjukkan bahwa kita sedang berhadapan dengan array.
Jadi di sini, kurung String argv, kami berurusan dengan sebuah array dari string.
Jadi argc, itu akan menunjukkan berapa banyak argumen kita sudah
dilewatkan ke program ini.
Dan untuk melihat apa artinya, mari kita tutup ini.
>> OK.
Jadi sampai sekarang, kami telah menjalankan setiap program seperti usia slash dot.
Kami juga bisa, pada baris perintah, melewati melewati argumen, sehingga istilah, perintah
argumen baris.
Jadi argumen pertama, hello world.
Jadi di sini, argc akan menjadi tiga.
Ini hitungan argumen pada baris perintah.
Argc selalu setidaknya 1, karena dot slash usia, itu sendiri, dianggap sebagai salah satu
argumen baris perintah.
>> Kemudian halo adalah yang pertama.
Jika usia slash dot adalah zeroth, maka halo adalah yang pertama, dan dunia adalah
kedua argumen baris perintah.
Jadi string argv, kita akan melihat, berisi string, dot slash
usia, halo, dan dunia.
Dan, dengan permintaan Daud, kita akan untuk memutar video memperkenalkan itu.
>> [VIDEO PLAYBACK]
>> -Sampai sekarang dalam program kita sudah ditulis, kami telah mendeklarasikan
utama seperti int void main.
Dan selama ini, kekosongan itu memiliki hanya telah menetapkan bahwa
Program tidak mengambil argumen baris perintah.
Dengan kata lain, ketika pengguna menjalankan sebuah Program, ia dapat memberikan perintah
baris argumen dengan menulis tambahan kata atau frase setelah program
nama pada prompt.
>> Nah, jika Anda ingin program Anda untuk mengambil argumen baris perintah, satu atau
kata yang lebih seperti itu, kita perlu mengganti membatalkan dengan beberapa argumen.
Jadi mari kita lakukan itu.
Sertakan CS50.h.
Sertakan io.h. standar
Int utama.
Dan sekarang, bukannya batal, aku akan menentukan int disebut argc, dan
array dari string disebut argv.
Sekarang, argc dan argv adalah hanya konvensi.
>> Kita bisa disebut argumen ini apa yang paling kita inginkan.
Tapi yang penting adalah bahwa argc adalah int karena, menurut definisi, adalah
akan berisi jumlah argumen, yang jumlah kata dalam jumlah yang
pengguna telah diketik pada nya prompt.
argv, sementara itu, vektor argumen, adalah akan benar-benar menjadi sebuah array menyimpan
semua kata-kata bahwa pengguna memiliki diketik pada nya prompt.
>> Mari kita lanjutkan untuk melakukan sesuatu sekarang dengan satu atau lebih dari ini
argumen baris perintah.
Secara khusus, mari kita pergi ke depan dan mencetak kata apa pun jenis pengguna
setelah nama program pada prompt.
Buka braket.
Tutup braket.
Printf persen s backslash dan koma.
Dan sekarang saya harus memberitahu printf nilai apa untuk plug ke placeholder itu.
Saya ingin kata pertama yang pengguna memiliki diketik setelah nama program,
dan jadi saya akan menentukan argv bracket 1, dekat
kurung, titik koma.
>> Sekarang, mengapa braket 1 dan tidak braket 0?
Nah, ternyata, secara otomatis disimpan dalam argv 0 akan menjadi
nama sebenarnya program.
Jadi kata pertama yang jenis pengguna setelah nama program ini adalah, dengan
konvensi, akan disimpan dalam argv 1.
Sekarang mari kita mengkompilasi dan menjalankan program ini.
>> Membuat argv 0, dot slash argv 0.
Dan sekarang kata seperti halo.
Enter.
Dan ada yang kita miliki, halo.
>> [END VIDEO PEMUTARAN]
>> ROB BODEN: Baiklah.
Tutup itu.
Jadi mengambil melihat program yang yang kami hanya diperkenalkan kepada kami, baik, hanya
untuk menunjukkan, jika kita mencetak argv 0, membuat, sekarang apa itu, argv 0, dot slash argv 0.
Jadi, seperti yang diharapkan, itu mencetak keluar nama program, karena argv 0 adalah
selalu akan menjadi nama program.
Tapi mari kita melakukan sesuatu yang sedikit lebih menarik.
>> Jadi di set masalah, Anda akan diperkenalkan ke fungsi ini, atoi.
Jadi apa yang kita gunakan untuk atoi?
Itu akan mengkonversi String ke integer.
Jadi jika saya lulus string, satu dua tiga, untuk atoi, yang akan mengkonversi
ke integer, satu dua tiga.
Jadi kita akan mengkonversi pertama baris argumen perintah untuk integer,
dan kemudian hanya mencetak integer yang.
>> Jadi pada dasarnya, kami jenis reimplementing getInt, hanya
integer masuk pada perintah baris bukan di program
interaktif.
Jadi, membuat argv 0, mari kita lakukan di sini, dan menutup itu.
Jadi berjalan argv 0, dan mari kita masukkan integer, satu dua tiga empat satu dua.
Jadi itu akan mencetak integer, satu dua tiga empat satu dua.
Ada beberapa kehalusan untuk atoi bahwa itu akan berhenti peduli tentang apa pun
di luar karakter numerik yang valid, tapi itu tidak masalah.
>> Jadi apa yang Anda pikirkan terjadi jika saya melakukan ini?
Kesalahan segmentasi.
Jadi kenapa begitu?
Jika Anda melihat kembali pada program kami, kami mengkonversi argv 1, argumen pertama
setelah nama program, ke integer.
Tetapi tidak ada argumen yang dilewatkan setelah nama program.
Jadi di sini, kita melihat bahwa ini adalah kereta program, karena, jika kita mencoba untuk menjalankannya
tanpa argumen, itu hanya akan crash.
>> Jadi lain pola umum Anda akan melihat adalah sesuatu seperti, jika argc kurang
dari dua, menunjukkan bahwa tidak ada setidaknya nama program dan
Argumen pertama, maka kita akan melakukan sesuatu seperti printf, tidak cukup
argumen baris perintah.
Itu mungkin tidak bagus untuk mencetak, itu mungkin sesuatu, seperti
Anda harus memasukkan sebuah integer pada baris perintah.
Aku hanya akan berakhir di sana.
Dan kemudian kembali 1.
Jadi ingat bahwa pada akhir kami Program, jika kita kembali 0, semacam
menunjukkan keberhasilan.
Dan utama juga secara otomatis mengembalikan 0 jika Anda tidak.
>> Jadi di sini, kita retuning 1 untuk menunjukkan bahwa itu tidak sukses.
Dan Anda dapat kembali apapun yang Anda inginkan, hanya, 0 menunjukkan keberhasilan, dan
apa pun mengindikasikan kegagalan.
Jadi mari kita menjalankan versi ini hal.
Jadi sekarang, jika kita tidak memasukkan baris perintah argumen, benar akan memberitahu
kami, tidak cukup baris perintah.
Tidak menyelesaikan kalimatnya.
Yang lain, jika kita benar-benar lulus satu, dapat menyelesaikan program.
Jadi ini adalah bagaimana Anda akan menggunakan argc di untuk memvalidasi jumlah
argumen baris perintah yang benar-benar berlalu.
>> Jadi mari kita membuat program ini sedikit lebih rumit, dan melihat kedua
iterasi hal.
Jadi sekarang, kita tidak hanya mencetak pertama argumen baris perintah.
Di sini, kita iterasi dari int i equals 0, i kurang dari argc, i ditambah
ditambah, dan pencetakan argv, indeks i.
Jadi pola ini, sekali lagi, ini adalah sama Pola seperti sebelumnya, kecuali bukan
memanggil variabel n, kita menggunakan argc.
>> Jadi ini iterasi setiap indeks dalam array, dan mencetak masing-masing
elemen dalam array itu.
Jadi, ketika kita menjalankan program ini, baik, Saya tidak memasukkan baris perintah
argumen, sehingga hanya sidik jari nama program.
Jika saya memasukkan berbagai hal, itu akan mencetak satu, masing-masing pada baris sendiri.
>> OK.
Jadi mari kita ini satu langkah lebih jauh.
Dan bukannya mencetak setiap argumen pada baris sendiri, mari kita mencetak masing-masing
karakter setiap argumen pada baris sendiri.
Jadi ingat bahwa argv adalah array dari string.
Jadi apa adalah string, tapi array karakter?
Jadi itu berarti bahwa argv adalah benar-benar array array karakter.
Jadi mengambil keuntungan dari itu, mari kita mengabaikan hal ini untuk saat ini.
Mari kita mempertimbangkan string argv 0.
>> Jadi jika kita ingin membawa setiap karakter argv 0 pada baris sendiri, maka saya ingin
untuk melakukan pola kita terbiasa, i adalah kurang dari panjang array,
yang di sini, adalah strlen dari, itu bukan apa yang ingin saya lakukan, tali
s sama argv 0.
Jadi saya kurang dari panjang kami array, yang dalam hal ini adalah array
karakter, i plus plus.
Dan, seperti yang kita lihat minggu lalu, itu ideal jika kita bergerak bahwa strlen luar
kondisi, karena n akan menambahkan strlen dari s setiap kali kita pergi
melalui loop, dan itu tidak akan berubah.
Jadi kita akan mengaturnya sama dengan n di sini.
>> OK.
Jadi sekarang, kita iterasi setiap indeks dalam array.
Jadi, jika kita ingin mencetak masing-masing karakter dalam array, persen c adalah
bendera kita ingin menggunakan untuk karakter.
Dan sekarang saya braket akan menjadi String, indeks karakter i, jadi jika
String adalah halo.
maka s 0 akan menjadi h, s braket 1 akan menjadi e, dan sebagainya.
>> Jadi sekarang kita ingin menggabungkan dua hal.
Kami ingin mencetak setiap karakter dari setiap argumen baris perintah.
Jadi kita akan memiliki bersarang untuk loop.
Dan konvensional, counter pertama adalah saya, berikutnya akan menjadi j, n
akan menjadi strlen dari argv i, i kurang dari n, i plus plus.
Dan sekarang bukan cetak argv i, sehingga argv braket i akan index -
yang akan menjadi baris perintah ke-i argumen, argv i, j akan
menjadi karakter j dari -i argumen.
Aku akan menyingkirkan ini di sini sekarang karena kita memasukkannya ke dalam lingkaran itu.
Jadi setara dengan equals string s argv i, dan kemudian s braket j.
>> Yah, kita tidak perlu mendeklarasikan s variabel ini.
Sebaliknya, kita hanya akan menggabungkan dua menjadi apa yang kita miliki, argv i, j.
>> SPEAKER 1: [Tak terdengar].
>> ROB BODEN: panggilan yang baik.
Jadi ini rusak.
Jika saya benar-benar berlari itu, kita akan telah menyadari hal ini.
Jadi meja saya peduli dalam hal ini khususnya untuk
loop j, iterator.
Jadi, Anda akan mengalami masalah, mungkin infinite loop, jika kita
tidak tetap itu.
Itu sebabnya kita juga berbicara tentang debugging hari ini.
>> OK.
Jadi mari kita menjalankan program ini.
Dan mari kita benar-benar menambahkan printf terpisah di sini yang hanya akan mencetak
baris lain, karena ini berarti ketika kita menjalankan program, akan ada kosong
garis di antara setiap karakter setiap argumen baris perintah.
Nah, kita akan melihat apa artinya.
Oop.
Mendapat beberapa bug.
Kesalahan implisit menyatakan fungsi perpustakaan strlen.
>> Jadi akan kembali ke program kami, saya lupa untuk hash termasuk string.h.
Jadi string.h akan menjadi file header yang menyatakan
fungsi strlen.
OK, itu mengkompilasi.
Sekarang, mari kita jalankan.
Jadi hanya itu.
Ini akan mencetak kami nama program, hello world.
Ini akan mencetak setiap hal, masing-masing karakter, pada baris sendiri.
OK.
>> Jadi mari kita benar-benar mengambil ini satu langkah lebih jauh.
Dan alih-alih menggunakan string.h, mari kita berpikir tentang bagaimana kita akan menerapkan kita sendiri
fungsi strlen.
Jadi saya akan segera memberikan tanda tangan fungsi.
Jadi mari kita sebut di my_strlen, dan itu akan mengambil string sebagai argumen,
dan kami berharap untuk kembali panjang string itu.
Jadi, di mana orang itu?
Ya.
OK.
Jadi ingat dari slide sebelumnya bahwa juga dari minggu lalu, bahwa
array karakter, baik, string, jadi mari kita mengatakan ini adalah kami string s.
Jadi, jika s adalah string, halo, kemudian, H-E-L-L-O, dalam memori, yang akan
menjadi, dan kemudian backslash ini 0 karakter.
>> Jadi bagaimana kita mendapatkan panjang s?
Nah, trik mencari ini serangan balik 0 karakter, null ini
terminator.
Jadi algoritma Apakah akan menjadi sesuatu seperti beberapa
cukup karakter yang -
mari kita tangan ini mewakili beberapa counter, mari kita sebut panjang int ini.
Jadi, mulai dari di sini, kami akan iterate atas string kita.
>> Jadi karakter pertama, itu H, dan itu tidak kembali memangkas 0, sehingga
panjangnya 1.
Iterate ke karakter berikutnya, E, dan itu tidak backslash 0.
Panjangnya 2.
L, 3.
L, 4.
O, 5.
Dan akhirnya, kita mencapai backslash 0, dan agar sarana, baik,
string ini berakhir.
Jadi mari kita kembali 5.
>> Jadi benar-benar menerapkan bahwa, pertama, panjang n saya sama dengan 0, tangan kananku.
Dan kita akan iterate -
>> SPEAKER 1: [Tak terdengar]
>> ROB BODEN: Oh, menembak.
Baik panggilan.
Boom.
Jadi panjang n sama dengan 0.
Jadi sekarang, panjang sementara s tidak sama dan kemudian, backslash 0.
Jadi ingat, backslash ini 0, itu adalah karakter yang sebenarnya, dan itu menunjukkan
akhir string.
Sama seperti, juga, backslash n adalah karakter yang sebenarnya.
Backslash 0 akan menunjukkan akhir string kami.
Saya tidak ingin menempatkan bahwa ada.
Dan sementara s diindeks oleh panjangnya tidak sama dengan terminator null, maka
kita hanya akan untuk kenaikan panjang.
Jadi, pada akhir program kami, panjang akhirnya akan
menjadi 5 dalam hal ini.
Dan kami hanya akan kembali panjang.
>> OK.
Jadi sekarang di sini, saya tidak lakukan my_strlen.
Mari kita compile untuk memastikan semuanya berjalan lancar.
Yang saya lakukan di 2?
Atau adalah bahwa 1?
Yang harus Anda lakukan.
Baik.
Jadi ini adalah argv 2.
Bekerja seperti yang diharapkan, meskipun adalah bahwa salah satu yang saya lakukan di?
Ya.
OK.
Versi hal tidak memiliki baris baru printf setelah, tetapi
tidak ada bedanya.
OK.
Jadi bekerja seperti yang diharapkan.
>> Sekarang kita bahkan dapat menggabungkan satu langkah lanjut, di mana pemberitahuan di sini, baik,
pertama, kita meraih strlen dari argv i, dan kemudian kita iterasi
setiap karakter dalam string tersebut.
Jadi, bukannya melakukan itu, bagaimana jika kita hanya menggabungkan logika ini menunggu
sampai kita memukul backslash 0 benar ke ini untuk loop?
Jadi iterate sementara argv i, j tidak tidak sama backslash 0.
Jadi mari kita jalankan dulu.
>> Baik.
Jadi di sini, kondisi ini mengatakan -
mari kita jelas itu.
Jadi sekarang, biarlah ini menjadi argv kami.
Jadi ketika saya hanya berlari program yang sebelumnya, argv adalah array dari string.
Jadi, jika saya menjalankannya dengan dot slash argv 2, hello world, maka argv tersebut
sendiri adalah panjang 3, untuk argv nol, halo, dan dunia.
>> Dan dalam setiap indeks tersebut adalah, sendiri sebuah array, di mana hal ini akan
dot, ini akan menjadi slash, saya tidak tahu apakah itu ke arah yang benar, saya
tidak berpikir itu.
A-R-V dash, membutuhkan lebih banyak ruang.
Mari kita potong array ini.
A-R-V dasbor 0, dan kemudian backslash 0.
Dan kemudian berantakan akan halo.
Katakanlah, H-E backslash 0.
Dan akhirnya, W-O backslash 0.
>> Jadi algoritma yang baru saja kita menulis, yang bersarang untuk loop, apa yang mereka
melakukan adalah, pertama-tama kita memiliki melawan i dan j kemudian.
Ini akan lebih mudah dengan kode pada layar, Mari kita kembali ke ini.
OK.
Jadi melihat bahwa saya adalah iterator yang iterasi setiap perintah
argumen baris.
Dan j adalah iterasi iterator atas masing-masing karakter dalam
argumen baris perintah.
Jadi apa printf terdalam ini adalah melakukan adalah, kami telah printf argv 0 0, printf
argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, tapi sekarang, argv 0 7 akan
sama backslash 0.
>> Jadi kita keluar bahwa untuk loop, dan sekarang saya iterates 1.
Dan sekarang kita akan print argv 1 0, argv 1 1 -
baik, sekarang, karena saya memotong pendek halo, argv 1 2 sekali lagi akan menjadi
backslash 0.
Jadi, kenaikan i dan terus, dan seterusnya, sampai kita mencetak semua
dunia, dan mereka adalah tiga baris perintah argumen, dan kita akan keluar dari
loop terluar, dan menyelesaikan program kami.
OK.
>> Jadi mari kita kembali ke sini.
Jadi, Anda akan mendapatkan beberapa keakraban dengan argumen baris perintah ini
masalah khusus yang ditetapkan.
>> Sekarang, debugging.
Jadi Anda mungkin sudah harus melakukan beberapa debugging dengan Anda sebelumnya
masalah ditetapkan.
Dan salah satu cara yang sangat mudah debugging, pertama, mari kita lihat program buggy.
Nah, berjalan melalui program ini, kita akan meminta pengguna untuk
integer, ambil bilangan bulat itu, dan kemudian, sewenang-wenang, kita memiliki loop sementara yang
hanya akan pengurangan i sampai itu sama dengan 10.
Mari kita berasumsi aku memasuki integer lebih besar dari 10.
Jadi pengurangan i sampai itu sama dengan 10.
>> Dan kemudian kita memiliki lingkaran sementara yang lain bahwa, sementara saya tidak sama dengan 0, kita
akan pengurangan i oleh 3.
Jadi jika Anda melihat maksud dari bug di sini, itu adalah bahwa ini akan pengurangan i untuk
menjadi 10, dan kemudian ini while loop akan pengurangan i dari 10, 7, 4, 1,
negatif 2, negatif 5, dan seterusnya, hingga tak terbatas negatif, karena saya akan
pernah benar-benar sama dengan 0.
Dan kemudian pada akhir program ini, kita memiliki fungsi foo yang
terjadi print out yang saya.
>> Jadi ini adalah program pendek dan sepele, dan bug yang jelas,
terutama setelah saya hanya mengatakan apa bug itu.
Tapi maksud di sini adalah, baik, ini mungkin benar-benar terlihat seperti beberapa Anda
solusi dari serakah dari terakhir masalah set, dan mungkin Anda harus
beberapa infinite loop dalam program Anda, dan Anda tidak tahu
apa penyebabnya.
Jadi teknik debugging yang sangat berguna adalah dengan hanya menambahkan printfs
seluruh kode Anda.
>> Jadi di sini saya ingin printf luar pertama loop sementara.
Dan di sini saya ingin printf a, dan aku hanya akan mencetak i.
Aku bahkan akan lakukan pertama while, i.
Di luar, kedua while loop.
Sekali lagi, dalam mencetak dari sini, nilai i.
Dan mari kita jalankan ini.
>> Jadi dot men-debug slash.
Masukkan integer.
Mari kita lakukan 13.
Dan boom.
Kita melihat bahwa kita adalah perulangan tak terbatas bagian dalam while loop kedua.
Jadi sekarang kita tahu apa bug tersebut.
Tapi printf debugging sempurna besar, tetapi sekali Anda mendapatkan program
lebih lama dan lebih rumit, ada solusi yang lebih canggih untuk
mendapatkan sesuatu yang bekerja.
Jadi mari kita menghapus semua printfs ini.
Dan mari kita pastikan saya tidak memutuskan apa-apa.
OK.
>> Jadi program kita akan untuk memperkenalkan disebut
GDB, untuk GNU Debugger.
Well, sebenarnya, mari kita menghapus debug untuk kedua, dan membuat men-debug lagi.
Nah, sebenarnya pertama kali, pelajaran yang baik dalam argumen baris perintah.
Perhatikan bahwa perintah dentang ini yaitu kompilasi semuanya sedang berlalu
pada baris perintah, ini argumen baris perintah.
Jadi persis bagaimana Anda akan menggunakan argumen baris perintah, seperti yang kita
lakukan sebelumnya, dan karena anda akan di PSET 2, itulah bagaimana dentang menggunakan mereka.
>> Jadi melihat bahwa ini pertama bendera, dasbor ggdb3, apa yang katakan adalah, dentang,
Anda harus mengkompilasi file ini dengan maksud bahwa kita akhirnya akan
perlu debug itu.
Jadi selama Anda memiliki bendera itu, maka kita dapat GDB debug.
Dan itu akan membuka GNU Debugger.
>> Jadi ada banyak perintah bahwa Anda perlu untuk membiasakan diri.
Yang pertama yang mungkin Anda akan segera butuhkan adalah Run.
Jadi apa yang Jalankan lakukan?
Ini akan memulai program kami.
Jadi menjalankan program awal, program ini meminta kita untuk integer, 13.
Dan maka itu perulangan tak terbatas sebagai diharapkan, kecuali saya dihapus
printfs, jadi kami bahkan tidak melihat itu.
Keluar secara normal.
Oh.
Ada kemungkinan bahwa itu dibungkus semua jalan di sekitar, kembali ke - mengabaikan itu.
Menganggap itu tidak keluar secara normal.
Ada jawaban yang rumit untuk itu.
>> Jadi sekarang, itu tidak terlalu berguna.
Jadi hanya menjalankan program kami dalam debugger ini tidak membantu kami dalam
cara, karena kita bisa saja melakukan dot slash debug dari luar GDB.
Jadi satu perintah yang Anda mungkin akan -
dan aku akan berhenti ini.
Control-d atau berhenti, keduanya bekerja.
Jadi mari kita membukanya lagi.
>> Perintah lain yang mungkin Anda akan segera ingin
biasakan adalah Break.
Jadi kita akan istirahat pada utama untuk saat ini, dan kemudian saya akan menjelaskan itu.
Nah, di sini kita melihat kita mengatur breakpoint di baris ini di debug.c.
Jadi apa istirahat berarti adalah bahwa ketika saya mengetikkan run, program ini akan
terus berjalan sampai Aku memukul breakpoint.
Jadi ketika saya menekan run, program dijalankan, dan kemudian istirahat secepat itu
memasuki fungsi utama.
Istirahat utama akan menjadi sesuatu Anda cukup sering dilakukan.
>> Dan sekarang, untuk memperkenalkan Anda untuk beberapa perintah lagi.
Perhatikan di sini, bahwa itu mengatakan kita pecah pada baris 11, yang
printf, masukkan integer.
Jadi perintah berikutnya akan menjadi bagaimana kita pergi ke baris berikutnya kode.
Ini akan memungkinkan kita untuk melangkah melalui kami program baris demi baris.
Jadi berikutnya.
>> Sekarang baris 12, kita akan untuk mendapatkan integer.
Berikutnya.
Dan jika Anda hanya tekan Enter lagi, itu akan mengulang hal terakhir yang Anda lakukan.
Jadi saya tidak perlu mengetik selanjutnya setiap kali.
Jadi memasukkan integer, 13.
Jadi sekarang, jalur 14, sementara saya lebih besar dari 10, dan aku akan lakukan selanjutnya.
Dan kita melihat kita akan pengurangan i.
Jadi kita akan pengurangan i lagi.
>> Jadi sekarang, lain yang berguna perintah Print.
Jadi Print akan mencetak nilai variabel.
Mari kita membawa nilai variabel i.
Mari kita mencetak i.
Ini akan mengatakan saya adalah 11.
Sekarang kita Next lagi sementara i lebih besar dari 10.
Jadi saya masih lebih besar dari 10, karena itu 11.
i dikurangi dikurangi.
Mari kita mencetak i lagi.
Seperti yang diharapkan, itu 10.
>> Jadi sekarang, berikutnya.
Ini akan kembali ke kondisi, i adalah lebih besar dari 10, tetapi saya sekarang 10, sehingga
itu tidak lebih besar dari 10, jadi kami berharap itu jatuh dari while loop.
Dan sekarang kita di bawah baris kode.
Dan perintah lain, Daftar, hanya akan untuk menampilkan sebelumnya dan berikutnya
beberapa baris kode, dalam Jika Anda kehilangan diri sendiri.
Jadi kita hanya keluar while loop ini, dan sekarang kita telah memasuki ini
while, baris 18.
Jadi sementara saya tidak sama dengan 0.
Dan, selanjutnya, saya sama i minus 3, dan kita akan perhatikan, ini hanya akan terus berjalan.
Dan kita dapat mencetak i.
>> Setiap perintah semacam memiliki cara pintas.
Jadi p adalah singkatan Print.
Jadi kita bisa p i.
Hanya tetap memegang n, atau tetap melakukan Next.
Cetak i lagi.
Anda lihat sekarang itu negatif 167.
Jadi ini akan berlangsung selamanya, tetapi tidak benar-benar selamanya, karena Anda hanya melihat, itu
sebenarnya akan berakhir di beberapa titik.
>> Jadi yang Mulai GDB.
Tapi mari kita lakukan satu hal lagi di GDB.
Uh, debug.
Jadi, dalam kasus ini, infinite loop kebetulan berada dalam
fungsi utama.
Dan untuk saat ini, hanya menerima bahwa bahwa aku akan memindahkan infinite loop ke
fungsi foo.
Hanya ingat bahwa, pada akhir ini Program, baik, ini awalnya
memanggil foo, yang hanya akan mencetak i.
Tapi sekarang kita memanggil foo, yang akan pengurangan i sampai itu 0, dan
kemudian mencetak variabel tersebut.
OK.
Simpan itu.
Membuat debug.
Dan sekarang, gdb debug.
OK.
>> Jadi jika saya hanya Run maka aku tidak akan dapat benar-benar langkah melalui saya
program baris demi baris.
Jadi mari kita istirahat di utama, dan kemudian ketik run.
Jadi pergi melalui ini, printf, masukkan integer, dapatkan integer, 13.
Jadi kita akan terus decrementing sampai saya lebih besar dari 10.
Kemudian kita akan jatuh melalui while, dan sampai ke baris -
mari kita membukanya dalam jendela terpisah.
Jadi kita dikurangi sampai saya tidak lagi lebih besar dari 10, dan kemudian kita
disebut fungsi, foo.
>> Jadi apa yang terjadi segera setelah saya memukul fungsi foo, baik, aku menelepon foo, dan
maka saya tidak lagi memiliki kontrol atas GDB.
Jadi, segera setelah aku memukul Berikutnya di baris ini, hal ini berlanjut sampai terjadi,
di mana program keluar saat -
menganggap itu tidak ada akhirnya.
Anda melihatnya berhenti untuk sedikit sekalipun.
Jadi kenapa saya kehilangan kontrol atas program pada saat itu?
Nah, ketika saya ketik selanjutnya, yang masuk ke literal baris berikutnya kode yang
akan mengeksekusi.
Jadi setelah baris 21, baris berikutnya kode yang akan mengeksekusi adalah baris 22,
yang, keluar dari utama.
Jadi saya tidak ingin hanya pergi ke baris berikutnya kode.
Saya ingin pergi ke fungsi, foo, dan kemudian juga langkah melalui
orang-orang baris kode.
>> Jadi untuk itu, kami memiliki alternatif.
Mari kita berhenti lagi.
Istirahat utama.
Uh, 1, next, next, 13, berikutnya, next, next, hati-hati,
sebelum kita memukul garis foo.
OK.
>> Jadi sekarang, kita berada di garis 21, di mana kita sebut foo.
Kami tidak ingin mengetik berikutnya, karena itu hanya akan memanggil fungsi foo, dan
pergi ke baris berikutnya kode.
Apa yang ingin kita gunakan adalah Step.
Jadi ada perbedaan antara Langkah dan Berikutnya, di mana Langkah langkah ke
berfungsi, dan Next pergi alih fungsi.
Itu hanya mengeksekusi keseluruhan fungsi dan terus terjadi.
>> Jadi Langkah ini akan membawa kita ke dalam fungsi, foo.
Dan kita lihat di sini, sekarang, kita kembali pada while ini itu, dalam teori,
akan terus selamanya.
Dan jika anda menekan Step, jika tidak bahkan fungsi untuk memanggil, maka itu
identik dengan Next.
Jadi itu hanya ketika Anda berada di garis yang memanggil fungsi yang Langkah
akan berbeda dari Next.
Jadi Step akan membawa kami di sini.
Langkah, langkah, langkah, langkah, langkah, langkah, dan kita hanya akan terbatas loop forever.
>> Jadi Anda mungkin terbiasa dengan bahwa Anda cara mengidentifikasi loop tak terbatas, adalah
hanya memegang ini Enter untuk melihat di mana Anda terjebak.
Ada cara yang lebih baik untuk melakukan itu, tapi untuk saat ini, yang cukup sempurna.
Dan Gaya, agar sesuai dengan Gaya 50, aku harus melakukan ini.
OK.
>> Jadi salah satu perintah terakhir untuk memperkenalkan.
Nah, mari kita men-debug gdb masuk
Jadi, bukannya melanggar di utama, jika saya mengetahui fungsi foo juga
masalah, maka saya bisa saja berkata, istirahat di foo, sebagai gantinya.
Katakanlah saya istirahat di baik utama dan foo.
Jadi Anda dapat mengatur sebanyak breakpoints seperti yang Anda inginkan.
Ketika saya mengetikkan run, itu akan untuk berhenti di -
ooh, mari kita mengkompilasi ulang, karena Saya mengubah hal-hal.
Anda akan melihat baris ini, Peringatan, sumber File lebih baru daripada dieksekusi.
Jadi itu berarti bahwa saya hanya pergi di sini dan mengubah ini agar sesuai dengan Gaya
50, tapi aku tidak mengkompilasi ulang program.
Jadi GDB membuat saya menyadari itu.
Aku akan berhenti, membuat men-debug lagi, memukul gdb debug.
OK.
>> Jadi sekarang, kembali ke apa yang saya lakukan.
Istirahat utama, istirahat foo.
Sekarang jika saya menjalankan program, sehingga akan berlanjut sampai hits
breakpoint.
Breakpoint yang terjadi pada menjadi yang pertama di utama.
Sekarang, bukannya melakukan next, next, next, next, next, sampai aku memukul foo, saya
dapat mengetik terus, yang akan terus sampai Anda menekan breakpoint berikutnya.
Saya harus memasukkan bilangan bulat pertama.
Lanjutkan akan berlanjut sampai aku memukul breakpoint berikutnya, yaitu bahwa
fungsi foo.
>> Jadi Run akan berjalan sampai Anda mencapai breakpoint, tapi Anda hanya mengetikkan run saat
Anda mulai program, dan kemudian, sejak saat itu, itu terus.
Jika saya hanya melakukan istirahat utama dan kemudian berlari, itu akan istirahat di
utama, dan kemudian melanjutkan.
Karena saya tidak memiliki titik istirahat di foo, masukkan integer, maka sekarang aku
tidak akan istirahat di foo.
Ini hanya akan tak terbatas loop sampai itu.
OK.
>> Jadi itulah Intro ke GDB.
Anda harus mulai menggunakannya di set masalah Anda.
Hal ini dapat sangat membantu untuk mengidentifikasi bug.
Jika Anda benar-benar adil, baris demi baris, pergi melalui kode Anda, dan membandingkan apa yang
sebenarnya terjadi dengan apa yang Anda harapkan terjadi, maka cukup
sulit untuk melewatkan bug Anda.
OK.
>> Jadi minggu lalu David dibesarkan ini hal kriptografi secret-key untuk
pertama kalinya, di mana kita tidak ingin password hanya disimpan pada kami
komputer dalam beberapa file teks biasa, di mana seseorang bisa datang dan hanya
membukanya dan membacanya.
Idealnya, mereka akan dienkripsi dalam beberapa cara.
Dan pada Soal Set 2, Anda akan berurusan dengan satu metode enkripsi,
atau, baik, dua metode, tetapi mereka tidak begitu besar.
Jika Anda melakukan edisi hacker, Anda juga akan berurusan dengan
mendekripsi beberapa hal.
>> Jadi masalah sekarang adalah, baik, bahkan jika kita memiliki enkripsi terkuat
algoritma di dunia, jika Anda memilih Sandi sangat miskin, maka
tidak akan membantu Anda sangat banyak, karena orang-orang akan tetap dapat mengetahuinya.
Bahkan jika melihat string terenkripsi dan sepertinya berantakan sampah
itu tidak ada artinya bagi mereka, jika mereka masih hanya perlu mencoba beberapa password
untuk mengetahuinya, maka Anda tidak sangat aman.
Jadi menonton video yang membuat titik itu.
>> [VIDEO PLAYBACK]
>> -Helm, Anda iblis.
Apa yang terjadi?
Apa yang Anda lakukan untuk anak saya?
>> -Ijinkan saya untuk memperkenalkan brilian ahli bedah plastik muda, Dr Phillip
Schlotkin, hidung terbesar man kerja di seluruh yang
semesta, dan Beverly Hills.
>> -Anda Mulia.
>> Hidung-job?
Saya tidak mengerti.
Dia sudah memiliki pekerjaan hidung.
Itu adalah sweet sixteen hadir.
>> -No.
Ini bukan apa yang Anda pikirkan.
Ini jauh, jauh lebih buruk.
Jika Anda tidak memberi saya kombinasi untuk perisai udara, Dr Schlotkin akan
memberikan hidung tuanya putri Anda kembali.
>> -No.
Dimana kau dapatkan itu?
>> Baiklah.
Aku akan memberitahu.
Tidak, ayah.
Tidak, Anda tidak harus.
>> -Kau benar, sayangku.
Aku akan merindukan hidung baru Anda.
Tapi aku tidak akan mengatakan kepadanya kombinasi, tidak peduli apa.
>> -Sangat baik.
Dr Schlotkin, lakukan terburuk Anda.
>> -My kesenangan.
>> [ALAT sedang diasah]
>> -No.
Tunggu.
Aku akan memberitahu.
>> -Aku tahu itu akan berhasil.
Baik.
Berikan padaku.
>> -Kombinasi adalah satu.
>> -One.
>> -Dua.
>> -Tiga.
>> -Empat.
>> -Lima.
>> -Jadi kombinasi adalah satu, dua, tiga, empat, lima.
Itu kombinasi terbodoh Yang pernah saya dengar dalam hidup saya.
Itulah jenis hal idiot akan ada pada bagasi.
>> -Terima kasih, Yang Mulia.
>> -Apa yang Anda lakukan?
>> -Aku berbalik dari dinding.
>> -Tidak Anda tidak.
Anda mematikan seluruh film.
>> -Saya harus telah menekan tombol yang salah.
>> -Well, meletakkannya kembali.
Menempatkan film kembali.
>> -Ya, Pak.
Ya, Pak.
>> -Mari kita pergi, Arnold.
Ayo, Gretchen.
Tentu saja, kau tahu aku masih akan harus menagih Anda untuk ini.
>> [END VIDEO PEMUTARAN]
>> ROB BODEN: Baiklah.
Jadi sekarang kita sudah berbicara tentang keamanan dalam beberapa hal, baik
sedikit poster film, sehingga dalam baru-baru ini hari, masalah ini dengan NSA
memantau semuanya.
Ini bisa sulit untuk merasa seperti Anda memiliki semacam privasi di
dunia online, meskipun saya tidak tahu Anda sebagian besar rincian PRISM.
Jadi bergerak di luar PRISM, kita tidak akan untuk berbicara tentang itu, sekarang
berpikir tentang laptop Anda.
Jadi di sini, saya ingin beralih ke akun saya yang sebenarnya,
dengan penguin kecil saya.
Jadi saya memiliki satu set password, dan bahwa password apa pun yang saya inginkan.
>> Tapi ingat bahwa apa yang saya penebangan dengan, jadi login ini
prompt, beberapa program tersebut.
Ini beberapa program yang tidak ditulis oleh beberapa orang.
Jadi, orang itu, jika mereka terutama berbahaya, mereka bisa
mengatakan, baik-baik saja, jadi jika password yang saya masukkan adalah sama dengan saya
password yang sebenarnya, atau itu sama beberapa sandi khusus -
David mengagumkan atau sesuatu -
kemudian biarkan mereka masuk
Jadi programmer berbahaya bisa memiliki akses ke semua Mac Anda, atau
Windows, atau apa pun.
>> Sehingga tidak banyak perhatian, karena, Maksudku, ini adalah program login
yang dikirimkan dengan OS X, ratusan atau ribuan orang
Ulasan kode ini.
Jadi, jika, dalam kode Anda di suatu tempat, Anda mengatakan jika string ini sama dengan equals
David mengagumkan, login, maka seseorang yang akan menjadi, seperti, tunggu.
Ini tidak benar.
Hal ini seharusnya tidak berada di sini.
Jadi itulah salah satu cara kita mendapatkan hal-hal menjadi semacam aman.
>> Tapi pikirkan bahkan program bahwa Anda menulis.
Katakanlah Anda menulis program login.
Jadi program login ini yang Anda tulis, jadi jelas, Anda baik seorang
programmer.
Anda tidak akan menempatkan setiap berbahaya jika x sama dengan sama dengan David mengagumkan
ke dalam kode Anda.
Namun program ini, apa yang Anda gunakan untuk mengkompilasi program ini?
Sesuatu seperti dentang.
Jadi bagaimana jika orang yang kebetulan menulis dentang cased khusus di dentang
sesuatu seperti, jika saya kompilasi Program login, kemudian masukkan kode ini
ke dalam program login yang mengatakan, jika x sama sama David mengagumkan?
Jadi tidak cukup, tapi kami memiliki yang sama mengeluarkan sini, di mana dentang, baik,
ribuan, jika tidak puluhan ribu orang, telah melihat dentang, memiliki
melihat garis-garis kode dan berkata, apa-apa, tidak ada yang buruk di sini.
Jelas, tidak ada yang melakukan hal ini berbahaya.
>> Tapi apa yang dentang itu sendiri, seperti, bagaimana jika saya mengkompilasi dentang?
Bagaimana jika saya memiliki beberapa kompiler yang mengkompilasi dentang yang memasukkan ke dentang
hack khusus ini yang mengatakan, baik-baik saja, ketika saya mengkompilasi dentang, maka
executable saya mendapatkan khusus harus melihat dalam program login dan masukkan
sandi ini, sama dengan equals Dave mengagumkan?
Jadi ingat bahwa kompiler Anda sendiri perlu dikompilasi di beberapa titik.
Jadi, jika apa yang Anda pilih untuk mengkompilasi dentang dengan, itu sendiri adalah berbahaya, maka Anda
dapat mengacaukan keseluruhan cara di telepon.
>> Jadi di sini, kami memiliki Ken Thompson dan Dennis Ritchie.
Jadi ini adalah foto ikonik.
Dennis Ritchie adalah di sebelah kanan.
Dia adalah besar -
cukup banyak menulis C. Jadi Anda bisa berterima kasih padanya untuk kelas ini.
Ken Thomson ada di sebelah kiri.
Keduanya pada dasarnya menulis UNIX.
Yah, mereka adalah kontributor utama di UNIX.
Ada beberapa orang lain.
Jadi Ken Thompson, di beberapa titik, ia memenangkan Turing Award.
Dan penghargaan Turing, Aku selalu mendengar itu direferensikan dengan cara ini, itu adalah
Hadiah Nobel ilmu komputer.
>> Jadi pada Turing Award, dia harus memberikan pidato penerimaannya.
Dan dia memberikan pidato yang sangat terkenal ini sekarang, disebut Refleksi Mempercayai
Trust, yang telah kita terkait Untuk di website saja.
Dan dalam pidato ini, katanya, semua yang benar, jadi saya menulis UNIX, dan sekarang semua
Anda orang yang menggunakan UNIX.
Sekarang, mengingat sekarang ini bahwa Linux adalah keturunan langsung dari UNIX.
OS X secara langsung menggunakan UNIX.
Windows tidak begitu banyak, tapi banyak ide diambil dari UNIX.
>> Jadi dia naik ke panggung dan berkata, semua benar, saya menulis UNIX.
Dan agar kalian tahu, aku bisa login ke setiap
satu pun dari komputer Anda.
Karena saya menempatkan satu ini khusus jika x sama sama Ken Thomson is awesome,
maka aku diizinkan untuk login.
Jadi orang-orang seperti, baik, bagaimana kau melakukan itu?
Kami melihat program login dan tidak ada di sana.
Dia seperti, baik, saya memodifikasi compiler login program login
sehingga program login sekarang akan memiliki bahwa x sama sama Ken Thompson
mengagumkan.
>> Dan mereka mengatakan, baik, itu tidak benar.
Kami sedang melihat compiler, dan compiler tidak memiliki baris
kode seperti itu.
Dia seperti, OK, tapi apa yang Anda kompilasi compiler dengan?
Dan mereka berpikir, dan dia, seperti, baik, Akulah yang memberi Anda compiler
Anda menggunakan compiler untuk mengkompilasi, sehingga Anda kompilasi kompilator, yang
sendiri adalah berbahaya, dan akan memecahkan program login.
Jadi pada dasarnya, pada saat itu, ada ada cara Anda bisa melihat sumber
kode program login untuk melihat apa yang salah.
Anda bahkan tidak bisa melihat di kode sumber kompilator
untuk melihat apa yang salah.
>> Anda akan perlu melihat mesin kode, biner sebenarnya dari
dikompilasi compiler untuk melihat, tunggu, ini baris kode seharusnya tidak berada di sini.
Tapi Ken Thompson mengambil satu langkah lebih lanjut dan mengatakan, baik, ada
program-program khusus yang benar-benar membantu Anda membaca biner program,
dan jadi jika seseorang menggunakan program tersebut untuk membaca biner, mereka akan melihat ini
baris kode.
Ia memodifikasi program-program untuk mengatakan, semua tepat, jika Anda mencari di
compiler, tidak menunjukkan khusus ini set biner.
>> Jadi Anda perlu mengambil langkah lebih lebih lanjut dan pada dasarnya, yang bisa memiliki
diambil beberapa tingkat tipuan, dan di beberapa titik, tidak ada yang benar-benar
akan memeriksa.
Jadi moral dari cerita ini adalah, Anda tidak akan menulis
Dentang di kelas ini.
Anda akan menggunakan climbing Dentang banyak di kelas ini.
Untuk semua yang Anda tahu, dentang adalah berbahaya program yang menyabotase setiap
program tunggal yang pernah dikompilasi.
Dan untuk meninggalkan Anda pada yang sangat menyenangkan perhatikan, melihat Anda pada hari Rabu.
>> [Tepuk Tangan]
>> SPEAKER 2: Pada CS50 berikutnya.
>> SPEAKER 3: Jangan kau berani mengatakan bahwa.
Anda dapat melakukan hal ini.
Anda telah melakukan ini sebelumnya, Anda dapat melakukan ini hari ini, Anda dapat melakukan hal ini besok.
Anda telah melakukan ini selama bertahun-tahun.
Hanya pergi ke sana dan melakukan hal ini.
Anda dapat melakukan hal ini.
>> [MUSIC PLAYING]