1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Mari kita menulis sebuah program yang mendapatkan string dari pengguna tanpa 3 00:00:02,920 --> 00:00:05,700 menggunakan CS50 Perpustakaan berfungsi GetString. 4 00:00:05,700 --> 00:00:08,720 Untuk melakukan hal ini, kita akan pergi ke depan dan menggunakan scanf, fungsi yang GetString tersebut 5 00:00:08,720 --> 00:00:10,950 fungsi benar-benar menggunakan di bawah tenda. 6 00:00:10,950 --> 00:00:13,780 Tapi aku akan melakukan ini dengan sengaja dengan cara buggy. 7 00:00:13,780 --> 00:00:17,230 Aku akan lakukan dengan cara yang saya pikir akan benar, tapi ternyata 8 00:00:17,230 --> 00:00:19,380 asumsi saya akan cukup, cukup cacat. 9 00:00:19,380 --> 00:00:20,800 Dan pada kenyataannya, cukup berbahaya. 10 00:00:20,800 --> 00:00:24,750 Karena bug seperti yang saya akan membuat dapat dimanfaatkan oleh musuh 11 00:00:24,750 --> 00:00:28,870 sehingga mesin Anda atau program Anda dapat diambil alih berpotensi. 12 00:00:28,870 --> 00:00:30,200 >> Mari kita mulai sebagai berikut. 13 00:00:30,200 --> 00:00:33,540 Pertama mari kita mendeklarasikan string kita, atau dikenal sekarang sebagai bintang char, 14 00:00:33,540 --> 00:00:34,750 dan menyebutnya s. 15 00:00:34,750 --> 00:00:39,400 Mari selanjutnya meminta pengguna untuk string, seperti "string silakan." Dan 16 00:00:39,400 --> 00:00:44,250 mari kita mendapatkan string dari pengguna menggunakan scanf, kutipan tanda kutip, "% s." Di 17 00:00:44,250 --> 00:00:47,760 Dengan kata lain, mari kita menginformasikan scanf kita yang pada kenyataannya berharap untuk mendapatkan string 18 00:00:47,760 --> 00:00:48,630 dari pengguna. 19 00:00:48,630 --> 00:00:50,810 >> Tapi sekarang kita perlu memberitahu scanf satu hal lain - 20 00:00:50,810 --> 00:00:53,350 di mana harus menempatkan string yang pengguna menyediakan. 21 00:00:53,350 --> 00:00:57,840 Yah, aku akan cukup sederhana mulai dengan koma s, menetapkan bahwa saya ingin 22 00:00:57,840 --> 00:00:59,320 scanf untuk menempatkan string di sana. 23 00:00:59,320 --> 00:01:04,818 Saya selanjutnya akan mencetak sesuatu seperti printf "terima kasih untuk% s 24 00:01:04,818 --> 00:01:10,670 backslash n koma. "Dan seperti biasa, aku akan lulus dalam string, s. 25 00:01:10,670 --> 00:01:14,920 Sekarang mari kita simpan, kompilasi, dan menjalankan ini Program, dan melihat apakah kita tidak dapat menginduksi 26 00:01:14,920 --> 00:01:16,590 masalah saya prediksi. 27 00:01:16,590 --> 00:01:18,650 >> Membuat scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String silakan. 30 00:01:21,830 --> 00:01:25,540 Mari kita memberikan sesuatu seperti, "halo." "Terima kasih atas nol." Hmm, itu bukan 31 00:01:25,540 --> 00:01:26,750 apa yang kuharapkan. 32 00:01:26,750 --> 00:01:28,240 Jadi apa yang terjadi di sini? 33 00:01:28,240 --> 00:01:32,040 >> Nah, ternyata karena kita menyatakan s sebagai bintang arang tapi kami tidak 34 00:01:32,040 --> 00:01:36,120 sebenarnya disimpan dalam s alamat dari potongan yang sebenarnya memori, scanf tidak 35 00:01:36,120 --> 00:01:38,940 punya tempat untuk menempatkan string bahwa pengguna diketik masuk 36 00:01:38,940 --> 00:01:42,510 Memang, jika pengguna adalah untuk sekarang ketik string lebih lama daripada "Halo," 37 00:01:42,510 --> 00:01:46,780 misalnya beberapa baris teks atau beberapa paragraf teks, itu cukup 38 00:01:46,780 --> 00:01:50,280 kemungkinan bahwa kita mungkin menginduksi disebut segmentasi kesalahan. 39 00:01:50,280 --> 00:01:53,570 >> Karena scanf tidak akan tahu bahwa Saya belum benar-benar menempatkan alamat 40 00:01:53,570 --> 00:01:54,610 dalam s. 41 00:01:54,610 --> 00:01:58,000 Sebaliknya, itu akan melihat beberapa nilai di s, beberapa pola bit yang mungkin 42 00:01:58,000 --> 00:02:00,910 sangat baik menjadi nilai sampah, ada hanya kebetulan. 43 00:02:00,910 --> 00:02:04,600 Dan scanf masih akan mencoba untuk menulis string pengguna ke alamat tersebut, 44 00:02:04,600 --> 00:02:08,789 bahkan jika itu adalah nilai sampah, yang memang bisa menyebabkan kecelakaan. 45 00:02:08,789 --> 00:02:10,130 >> Jadi bagaimana kita akan memperbaiki ini? 46 00:02:10,130 --> 00:02:12,523