>> SPEAKER 1: Mari kita menulis sebuah program yang mendapatkan string dari pengguna tanpa
menggunakan CS50 Perpustakaan berfungsi GetString.
Untuk melakukan hal ini, kita akan pergi ke depan dan menggunakan scanf, fungsi yang GetString tersebut
fungsi benar-benar menggunakan di bawah tenda.
Tapi aku akan melakukan ini dengan sengaja dengan cara buggy.
Aku akan lakukan dengan cara yang saya pikir akan benar, tapi ternyata
asumsi saya akan cukup, cukup cacat.
Dan pada kenyataannya, cukup berbahaya.
Karena bug seperti yang saya akan membuat dapat dimanfaatkan oleh musuh
sehingga mesin Anda atau program Anda dapat diambil alih berpotensi.
>> Mari kita mulai sebagai berikut.
Pertama mari kita mendeklarasikan string kita, atau dikenal sekarang sebagai bintang char,
dan menyebutnya s.
Mari selanjutnya meminta pengguna untuk string, seperti "string silakan." Dan
mari kita mendapatkan string dari pengguna menggunakan scanf, kutipan tanda kutip, "% s." Di
Dengan kata lain, mari kita menginformasikan scanf kita yang pada kenyataannya berharap untuk mendapatkan string
dari pengguna.
>> Tapi sekarang kita perlu memberitahu scanf satu hal lain -
di mana harus menempatkan string yang pengguna menyediakan.
Yah, aku akan cukup sederhana mulai dengan koma s, menetapkan bahwa saya ingin
scanf untuk menempatkan string di sana.
Saya selanjutnya akan mencetak sesuatu seperti printf "terima kasih untuk% s
backslash n koma. "Dan seperti biasa, aku akan lulus dalam string, s.
Sekarang mari kita simpan, kompilasi, dan menjalankan ini Program, dan melihat apakah kita tidak dapat menginduksi
masalah saya prediksi.
>> Membuat scanf-1.
./scanf-1.
String silakan.
Mari kita memberikan sesuatu seperti, "halo." "Terima kasih atas nol." Hmm, itu bukan
apa yang kuharapkan.
Jadi apa yang terjadi di sini?
>> Nah, ternyata karena kita menyatakan s sebagai bintang arang tapi kami tidak
sebenarnya disimpan dalam s alamat dari potongan yang sebenarnya memori, scanf tidak
punya tempat untuk menempatkan string bahwa pengguna diketik masuk
Memang, jika pengguna adalah untuk sekarang ketik string lebih lama daripada "Halo,"
misalnya beberapa baris teks atau beberapa paragraf teks, itu cukup
kemungkinan bahwa kita mungkin menginduksi disebut segmentasi kesalahan.
>> Karena scanf tidak akan tahu bahwa Saya belum benar-benar menempatkan alamat
dalam s.
Sebaliknya, itu akan melihat beberapa nilai di s, beberapa pola bit yang mungkin
sangat baik menjadi nilai sampah, ada hanya kebetulan.
Dan scanf masih akan mencoba untuk menulis string pengguna ke alamat tersebut,
bahkan jika itu adalah nilai sampah, yang memang bisa menyebabkan kecelakaan.
>> Jadi bagaimana kita akan memperbaiki ini?