1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Mari kita menulis program yang mendapat rentetan 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 ini, kami akan pergi ke hadapan dan menggunakan scanf, fungsi yang GetString yang 5 00:00:08,720 --> 00:00:10,950 fungsi sebenarnya menggunakan di bawah hood. 6 00:00:10,950 --> 00:00:13,780 Tetapi saya akan melakukan ini sengaja dengan cara kereta. 7 00:00:13,780 --> 00:00:17,230 Saya akan melakukan dengan cara yang saya rasa akan menjadi betul, tetapi ia ternyata bahawa 8 00:00:17,230 --> 00:00:19,380 andaian saya akan agak, agak cacat. 9 00:00:19,380 --> 00:00:20,800 Dan sebenarnya, agak berbahaya. 10 00:00:20,800 --> 00:00:24,750 Kerana pepijat seperti yang saya kira-kira untuk membuat boleh dieksploitasi oleh musuh- 11 00:00:24,750 --> 00:00:28,870 itu bahawa mesin anda atau program anda boleh diambil alih berpotensi. 12 00:00:28,870 --> 00:00:30,200 >> Mari kita mulakan seperti berikut. 13 00:00:30,200 --> 00:00:33,540 Pertama mari kita mengisytiharkan tali kita, atau dikenali sekarang sebagai bintang char, 14 00:00:33,540 --> 00:00:34,750 dan panggilan ia s. 15 00:00:34,750 --> 00:00:39,400 Mari seterusnya meminta pengguna untuk tali, seperti dengan "rentetan sila." Dan 16 00:00:39,400 --> 00:00:44,250 mari kita kini mendapat tali dari pengguna menggunakan scanf, quote unquote, "% s." Dalam 17 00:00:44,250 --> 00:00:47,760 erti kata lain, mari kita memberitahu kita bahawa scanf jangan sebenarnya mengharapkan untuk mendapatkan rentetan 18 00:00:47,760 --> 00:00:48,630 daripada pengguna. 19 00:00:48,630 --> 00:00:50,810 >> Tetapi sekarang kita perlu memberitahu scanf satu perkara yang lain - 20 00:00:50,810 --> 00:00:53,350 di mana untuk meletakkan rentetan yang pengguna menyediakan. 21 00:00:53,350 --> 00:00:57,840 Well, saya akan cukup hanya bermula dengan koma s, dengan menyatakan bahawa saya ingin 22 00:00:57,840 --> 00:00:59,320 scanf untuk meletakkan tali di sana. 23 00:00:59,320 --> 00:01:04,818 Saya seterusnya akan mencetak sesuatu seperti printf "terima kasih untuk% s 24 00:01:04,818 --> 00:01:10,670 garis sendeng terbalik n koma. "Dan seperti biasa, saya akan lulus dalam tali, s. 25 00:01:10,670 --> 00:01:14,920 Sekarang mari kita menyimpan, menyusun, dan menjalankan ini program, dan lihat jika kita tidak boleh mendorong 26 00:01:14,920 --> 00:01:16,590 masalah yang saya diramalkan. 27 00:01:16,590 --> 00:01:18,650 >> Buat scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Rentetan sila. 30 00:01:21,830 --> 00:01:25,540 Mari kita memberikan sesuatu seperti, "hello." "Terima kasih kerana nol." Hmm, itu bukan 31 00:01:25,540 --> 00:01:26,750 apa yang saya menjangkakan. 32 00:01:26,750 --> 00:01:28,240 Jadi apa yang berlaku di sini? 33 00:01:28,240 --> 00:01:32,040 >> Nah, ternyata kerana kita diisytiharkan sebagai penyanyi char tetapi kita tidak 34 00:01:32,040 --> 00:01:36,120 sebenarnya disimpan dalam s alamat satu sebahagian sebenar ingatan, scanf tidak 35 00:01:36,120 --> 00:01:38,940 mempunyai mana-mana sahaja untuk meletakkan tali bahawa pengguna ditaip masuk 36 00:01:38,940 --> 00:01:42,510 Sesungguhnya, jika pengguna adalah untuk sekarang taip tali yang lebih lama daripada "hello," 37 00:01:42,510 --> 00:01:46,780 misalnya beberapa baris teks atau beberapa perenggan teks, ia agak 38 00:01:46,780 --> 00:01:50,280 mungkin kita mungkin mendorong kononnya segmentasi bersalah. 39 00:01:50,280 --> 00:01:53,570 >> Kerana scanf tidak akan tahu bahawa Saya tidak benar-benar meletakkan alamat 40 00:01:53,570 --> 00:01:54,610 dalam s. 41 00:01:54,610 --> 00:01:58,000 Sebaliknya, ia akan melihat beberapa nilai dalam s, beberapa corak bit yang boleh 42 00:01:58,000 --> 00:02:00,910 dengan baik menjadi nilai sampah, sana hanya secara kebetulan. 43 00:02:00,910 --> 00:02:04,600 Dan scanf masih akan cuba untuk menulis rentetan pengguna untuk alamat itu, 44 00:02:04,600 --> 00:02:08,789 walaupun ia adalah satu nilai sampah, yang memang boleh mendorong kemalangan. 45 00:02:08,789 --> 00:02:10,130 >> Jadi bagaimana kita boleh menetapkan ini? 46 00:02:10,130 --> 00:02:12,523