1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> 揚聲器1:讓我們寫一個程序, 從用戶得到的字符串不 3 00:00:02,920 --> 00:00:05,700 使用CS50圖書館 函數GetString的。 4 00:00:05,700 --> 00:00:08,720 要做到這一點,我們將繼續使用 scanf函數,該函數的GetString的 5 00:00:08,720 --> 00:00:10,950 函數實際上使用 引擎蓋下方。 6 00:00:10,950 --> 00:00:13,780 但我要故意這樣做 在越野車的方式。 7 00:00:13,780 --> 00:00:17,230 我會做的方式,我認為 會是正確的,但事實證明, 8 00:00:17,230 --> 00:00:19,380 我的假設是要 是相當,相當的缺陷。 9 00:00:19,380 --> 00:00:20,800 而事實上,相當危險。 10 00:00:20,800 --> 00:00:24,750 因為像我快要錯誤 使得可以通過對手所利用 11 00:00:24,750 --> 00:00:28,870 這樣,您的機器或程序 可以接管可能。 12 00:00:28,870 --> 00:00:30,200 >> 讓我們開始如下。 13 00:00:30,200 --> 00:00:33,540 首先,讓我們聲明我們的字符串, 現在也被稱為一個char星, 14 00:00:33,540 --> 00:00:34,750 並調用它s。 15 00:00:34,750 --> 00:00:39,400 讓接下來的提示輸入字符串的用戶, 與“字符串,請。”和 16 00:00:39,400 --> 00:00:44,250 現在讓我們得到字符串從用戶 使用scanf函數,報價引文結束,“%s的。”在 17 00:00:44,250 --> 00:00:47,760 換句話說,讓我們來告訴scanf函數,我們 確實是希望得到一個字符串 18 00:00:47,760 --> 00:00:48,630 從用戶。 19 00:00:48,630 --> 00:00:50,810 >> 但現在我們需要告訴scanf函數 另一件事 - 20 00:00:50,810 --> 00:00:53,350 放在哪裡的字符串 用戶所提供的。 21 00:00:53,350 --> 00:00:57,840 嗯,我會很簡單地啟動 用逗號秒,指定我想 22 00:00:57,840 --> 00:00:59,320 scanf函數把字符串那裡。 23 00:00:59,320 --> 00:01:04,818 我接下來將要打印出來的東西 如printf“感謝您的%s的 24 00:01:04,818 --> 00:01:10,670 反斜杠Ñ逗號。“與往常一樣,我 要通過在字符串,秒。 25 00:01:10,670 --> 00:01:14,920 現在讓我們保存,編譯並運行此 程序,看看如果我們不能誘發 26 00:01:14,920 --> 00:01:16,590 這個問題我預言。 27 00:01:16,590 --> 00:01:18,650 >> 使scanf函數-1。 28 00:01:18,650 --> 00:01:20,960 ./scanf-1。 29 00:01:20,960 --> 00:01:21,830 字符串請。 30 00:01:21,830 --> 00:01:25,540 讓我們提供的東西一樣,“你好。” “謝謝你的空。”嗯,這不是 31 00:01:25,540 --> 00:01:26,750 我所期待的。 32 00:01:26,750 --> 00:01:28,240 那麼,什麼是怎麼回事? 33 00:01:28,240 --> 00:01:32,040 >> 嗯,原來是因為我們聲明 S作為一個char明星,但我們沒 34 00:01:32,040 --> 00:01:36,120 實際上存儲在s的地址 的實際內存塊,scanf函數沒有 35 00:01:36,120 --> 00:01:38,940 必須隨時隨地把字符串 用戶鍵入。 36 00:01:38,940 --> 00:01:42,510 事實上,如果用戶要鍵入現在在 一個更長的字符串不是“你好”, 37 00:01:42,510 --> 00:01:46,780 比如幾行文字或 文本的幾個段落,這是相當 38 00:01:46,780 --> 00:01:50,280 可能我們會誘發 所謂分段錯誤。 39 00:01:50,280 --> 00:01:53,570 >> 因為scanf函數是不會知道 我還沒有真正把一個地址 40 00:01:53,570 --> 00:01:54,610 裡面的秒。 41 00:01:54,610 --> 00:01:58,000 相反,它會看到一些價值 s中,一些模式位可能 42 00:01:58,000 --> 00:02:00,910 很好是一個垃圾值, 那裡只是偶然。 43 00:02:00,910 --> 00:02:04,600 和scanf還是要去嘗試寫 用戶字符串到該地址, 44 00:02:04,600 --> 00:02:08,789 即使它是一個垃圾值,這 確實可以導致系統崩潰。 45 00:02:08,789 --> 00:02:10,130 >> 那麼我們如何解決這一問題? 46 00:02:10,130 --> 00:02:12,523