2 00:00:00,000 --> 00:00:01,860 >> SPEAKER 1: Mari kita lihat di perpustakaan CS50 yang, 3 00:00:01,860 --> 00:00:05,190 khusus fungsi GetInt itu. 4 00:00:05,190 --> 00:00:07,820 Di sini kita mempunyai sumber yang sebenar kod untuk GetInt. 5 00:00:07,820 --> 00:00:12,050 Dan melihat bahawa ia tidak terlalu panjang, dan sebahagian besar merupakan gelung sementara - 6 00:00:12,050 --> 00:00:15,620 gelung tak terhingga pada yang - bahawa hanya mengembalikan nilai yang sebaik sahaja kami telah sebenarnya 7 00:00:15,620 --> 00:00:17,400 mendapat apa yang kita harapkan. 8 00:00:17,400 --> 00:00:18,700 Mari kita berjalan melaluinya. 9 00:00:18,700 --> 00:00:21,650 >> Perhatikan di sini pertama, manakala gelung bermula. 10 00:00:21,650 --> 00:00:25,390 Notis seterusnya bahawa kita mempunyai baris kod yang benar-benar panggilan GetString, 11 00:00:25,390 --> 00:00:29,620 dan menyimpan nilai pulangan dalam berubah-ubah, yang dipanggil talian, jenis tali. 12 00:00:29,620 --> 00:00:31,210 Maka kita lakukan sedikit cek kewarasan. 13 00:00:31,210 --> 00:00:35,770 Jika garis == batal, maka kita ingin tahu kembali INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Kini ternyata bahawa INT_MAX adalah berterusan khas diisytiharkan di tempat lain 15 00:00:40,140 --> 00:00:44,030 yang menentukan yang terbesar mungkin int bahawa anda boleh mewakili dalam 16 00:00:44,030 --> 00:00:45,160 program seperti ini. 17 00:00:45,160 --> 00:00:49,430 Sekarang kita telah sewenang-wenangnya membuat keputusan untuk pulang INT_MAX sebagai nilai sentinel daripada 18 00:00:49,430 --> 00:00:53,120 macam, salah satu yang kita telah dikhaskan sebagai bermakna kesilapan telah berlaku. 19 00:00:53,120 --> 00:00:56,230 Jadi harga yang kita bayar, sudah tentu, adalah GetInt yang boleh nampaknya tidak 20 00:00:56,230 --> 00:01:01,440 sebenarnya mengembalikan nombor yang besar seperti INT_MAX, kerana walaupun ia mahu, 21 00:01:01,440 --> 00:01:04,730 bahawa nilai pulangan perlu benar-benar ditafsirkan oleh pemanggil - 22 00:01:04,730 --> 00:01:06,260 sesiapa yang menggunakan GetInt - 23 00:01:06,260 --> 00:01:09,340 sebagai suatu kesilapan sejenis. 24 00:01:09,340 --> 00:01:13,840 >> Seterusnya, notis bahawa saya telah diisytiharkan n int dan char c. 25 00:01:13,840 --> 00:01:18,030 Dalam baris ini seterusnya kod, saya panggilan fungsi dipanggil sscanf, lulus dalam 26 00:01:18,030 --> 00:01:18,970 empat hujah. 27 00:01:18,970 --> 00:01:25,110 talian, yang merupakan tali pengguna ditaip dalam, "% i% c", yang merupakan format yang 28 00:01:25,110 --> 00:01:28,850 tali bahawa saya mengharapkan kekuatan pengguna jenis, diikuti dengan alamat 29 00:01:28,850 --> 00:01:30,920 n, dan alamat c. 30 00:01:30,920 --> 00:01:34,860 Tujuan Sekarang sscanf dalam kehidupan memang untuk mengimbas rentetan mencari yang 31 00:01:34,860 --> 00:01:38,700 format tertentu yang pengaturcara telah ditetapkan seperti yang bahawa hujah kedua. 32 00:01:38,700 --> 00:01:42,020 Dalam kes ini,% i adalah di ada, seperti yang% c. 33 00:01:42,020 --> 00:01:46,700 Jadi jika sscanf ditimpa int dalam input pengguna, int yang akan disimpan 34 00:01:46,700 --> 00:01:50,270 dalam pembolehubah dipanggil n, kerana kami telah menyediakan sebagai yang ketiga 35 00:01:50,270 --> 00:01:52,810 hujah untuk sscanf alamat n. 36 00:01:52,810 --> 00:01:56,870 Yang bermaksud bahawa sscanf memang boleh pergi sana, dan mengubah nilai di dalamnya. 37 00:01:56,870 --> 00:01:59,990 >> Sekarang, dalam kes jenis pengguna dalam sesuatu yang lebih 38 00:01:59,990 --> 00:02:01,220 daripada satu atau lebih digit - 39 00:02:01,220 --> 00:02:03,570 dalam erti kata lain, char sejenis - 40 00:02:03,570 --> 00:02:07,940 yang c boleh ubah kedua, yang alamat kita lulus ke sscanf sebagai keempat 41 00:02:07,940 --> 00:02:10,560 hujah juga akan penduduk. 42 00:02:10,560 --> 00:02:14,220 Sekarang terbalik menyemak untuk watak tambahan daripada pengguna adalah 43 00:02:14,220 --> 00:02:17,360 bahawa jika dia tidak bekerjasama, dan jenis di lebih daripada sekadar satu int, 44 00:02:17,360 --> 00:02:20,530 kita akan dapat mengesannya dalam ini cara, kerana dalam kes itu, sscanf 45 00:02:20,530 --> 00:02:24,860 akan kembali 2, menandakan bahawa kedua-dua ruang letak telah diisi 46 00:02:24,860 --> 00:02:25,600 dengan nilai-nilai. 47 00:02:25,600 --> 00:02:30,360 Tetapi kita berharap sscanf bahawa bukan mengembalikan 1, yang bermaksud pengguna hanya 48 00:02:30,360 --> 00:02:31,630 disediakan int satu. 49 00:02:31,630 --> 00:02:34,480 >> Apa yang kami lakukan jika sscanf sesungguhnya mengembalikan 1? 50 00:02:34,480 --> 00:02:39,150 Nah, kita serta-merta membebaskan baris yang pengguna ditaip dalam, dan kemudian kita 51 00:02:39,150 --> 00:02:42,670 segera kembali n, mempunyai mendapat int satu. 52 00:02:42,670 --> 00:02:47,180 Lagi, jika sscanf tidak kembali 1, dan pengguna oleh itu tidak bekerjasama, 53 00:02:47,180 --> 00:02:51,470 kita masih membebaskan garisan, tetapi kita kini segera pengguna untuk mencuba semula. 54 00:02:51,470 --> 00:02:55,390 Dan kerana kami masih dalam yang gelung jika tidak terhingga, proses 55 00:02:55,390 --> 00:03:00,190 akan bermula sekali lagi, dan mungkin sekali lagi, dan mungkin lagi, sehingga pengguna sebenarnya 56 00:03:00,190 --> 00:03:01,500 memberikan kita satu int. 57 00:03:01,500 --> 00:03:21,490