>> SPEAKER 1: Mari kita menulis program yang mendapat rentetan dari pengguna tanpa
menggunakan CS50 Perpustakaan berfungsi GetString.
Untuk melakukan ini, kami akan pergi ke hadapan dan menggunakan scanf, fungsi yang GetString yang
fungsi sebenarnya menggunakan di bawah hood.
Tetapi saya akan melakukan ini sengaja dengan cara kereta.
Saya akan melakukan dengan cara yang saya rasa akan menjadi betul, tetapi ia ternyata bahawa
andaian saya akan agak, agak cacat.
Dan sebenarnya, agak berbahaya.
Kerana pepijat seperti yang saya kira-kira untuk membuat boleh dieksploitasi oleh musuh-
itu bahawa mesin anda atau program anda boleh diambil alih berpotensi.
>> Mari kita mulakan seperti berikut.
Pertama mari kita mengisytiharkan tali kita, atau dikenali sekarang sebagai bintang char,
dan panggilan ia s.
Mari seterusnya meminta pengguna untuk tali, seperti dengan "rentetan sila." Dan
mari kita kini mendapat tali dari pengguna menggunakan scanf, quote unquote, "% s." Dalam
erti kata lain, mari kita memberitahu kita bahawa scanf jangan sebenarnya mengharapkan untuk mendapatkan rentetan
daripada pengguna.
>> Tetapi sekarang kita perlu memberitahu scanf satu perkara yang lain -
di mana untuk meletakkan rentetan yang pengguna menyediakan.
Well, saya akan cukup hanya bermula dengan koma s, dengan menyatakan bahawa saya ingin
scanf untuk meletakkan tali di sana.
Saya seterusnya akan mencetak sesuatu seperti printf "terima kasih untuk% s
garis sendeng terbalik n koma. "Dan seperti biasa, saya akan lulus dalam tali, s.
Sekarang mari kita menyimpan, menyusun, dan menjalankan ini program, dan lihat jika kita tidak boleh mendorong
masalah yang saya diramalkan.
>> Buat scanf-1.
./scanf-1.
Rentetan sila.
Mari kita memberikan sesuatu seperti, "hello." "Terima kasih kerana nol." Hmm, itu bukan
apa yang saya menjangkakan.
Jadi apa yang berlaku di sini?
>> Nah, ternyata kerana kita diisytiharkan sebagai penyanyi char tetapi kita tidak
sebenarnya disimpan dalam s alamat satu sebahagian sebenar ingatan, scanf tidak
mempunyai mana-mana sahaja untuk meletakkan tali bahawa pengguna ditaip masuk
Sesungguhnya, jika pengguna adalah untuk sekarang taip tali yang lebih lama daripada "hello,"
misalnya beberapa baris teks atau beberapa perenggan teks, ia agak
mungkin kita mungkin mendorong kononnya segmentasi bersalah.
>> Kerana scanf tidak akan tahu bahawa Saya tidak benar-benar meletakkan alamat
dalam s.
Sebaliknya, ia akan melihat beberapa nilai dalam s, beberapa corak bit yang boleh
dengan baik menjadi nilai sampah, sana hanya secara kebetulan.
Dan scanf masih akan cuba untuk menulis rentetan pengguna untuk alamat itu,
walaupun ia adalah satu nilai sampah, yang memang boleh mendorong kemalangan.
>> Jadi bagaimana kita boleh menetapkan ini?