>> SPEAKER 1: Mari kita lihat di perpustakaan CS50 yang,
khusus fungsi GetInt itu.
Di sini kita mempunyai sumber yang sebenar kod untuk GetInt.
Dan melihat bahawa ia tidak terlalu panjang, dan sebahagian besar merupakan gelung sementara -
gelung tak terhingga pada yang - bahawa hanya mengembalikan nilai yang sebaik sahaja kami telah sebenarnya
mendapat apa yang kita harapkan.
Mari kita berjalan melaluinya.
>> Perhatikan di sini pertama, manakala gelung bermula.
Notis seterusnya bahawa kita mempunyai baris kod yang benar-benar panggilan GetString,
dan menyimpan nilai pulangan dalam berubah-ubah, yang dipanggil talian, jenis tali.
Maka kita lakukan sedikit cek kewarasan.
Jika garis == batal, maka kita ingin tahu kembali INT_MAX.
>> Kini ternyata bahawa INT_MAX adalah berterusan khas diisytiharkan di tempat lain
yang menentukan yang terbesar mungkin int bahawa anda boleh mewakili dalam
program seperti ini.
Sekarang kita telah sewenang-wenangnya membuat keputusan untuk pulang INT_MAX sebagai nilai sentinel daripada
macam, salah satu yang kita telah dikhaskan sebagai bermakna kesilapan telah berlaku.
Jadi harga yang kita bayar, sudah tentu, adalah GetInt yang boleh nampaknya tidak
sebenarnya mengembalikan nombor yang besar seperti INT_MAX, kerana walaupun ia mahu,
bahawa nilai pulangan perlu benar-benar ditafsirkan oleh pemanggil -
sesiapa yang menggunakan GetInt -
sebagai suatu kesilapan sejenis.
>> Seterusnya, notis bahawa saya telah diisytiharkan n int dan char c.
Dalam baris ini seterusnya kod, saya panggilan fungsi dipanggil sscanf, lulus dalam
empat hujah.
talian, yang merupakan tali pengguna ditaip dalam, "% i% c", yang merupakan format yang
tali bahawa saya mengharapkan kekuatan pengguna jenis, diikuti dengan alamat
n, dan alamat c.
Tujuan Sekarang sscanf dalam kehidupan memang untuk mengimbas rentetan mencari yang
format tertentu yang pengaturcara telah ditetapkan seperti yang bahawa hujah kedua.
Dalam kes ini,% i adalah di ada, seperti yang% c.
Jadi jika sscanf ditimpa int dalam input pengguna, int yang akan disimpan
dalam pembolehubah dipanggil n, kerana kami telah menyediakan sebagai yang ketiga
hujah untuk sscanf alamat n.
Yang bermaksud bahawa sscanf memang boleh pergi sana, dan mengubah nilai di dalamnya.
>> Sekarang, dalam kes jenis pengguna dalam sesuatu yang lebih
daripada satu atau lebih digit -
dalam erti kata lain, char sejenis -
yang c boleh ubah kedua, yang alamat kita lulus ke sscanf sebagai keempat
hujah juga akan penduduk.
Sekarang terbalik menyemak untuk watak tambahan daripada pengguna adalah
bahawa jika dia tidak bekerjasama, dan jenis di lebih daripada sekadar satu int,
kita akan dapat mengesannya dalam ini cara, kerana dalam kes itu, sscanf
akan kembali 2, menandakan bahawa kedua-dua ruang letak telah diisi
dengan nilai-nilai.
Tetapi kita berharap sscanf bahawa bukan mengembalikan 1, yang bermaksud pengguna hanya
disediakan int satu.
>> Apa yang kami lakukan jika sscanf sesungguhnya mengembalikan 1?
Nah, kita serta-merta membebaskan baris yang pengguna ditaip dalam, dan kemudian kita
segera kembali n, mempunyai mendapat int satu.
Lagi, jika sscanf tidak kembali 1, dan pengguna oleh itu tidak bekerjasama,
kita masih membebaskan garisan, tetapi kita kini segera pengguna untuk mencuba semula.
Dan kerana kami masih dalam yang gelung jika tidak terhingga, proses
akan bermula sekali lagi, dan mungkin sekali lagi, dan mungkin lagi, sehingga pengguna sebenarnya
memberikan kita satu int.