揚聲器1:讓我們寫一個程序, 從用戶得到的字符串不 使用CS50圖書館 函數GetString的。 要做到這一點,我們將繼續使用 scanf函數,該函數的GetString的 函數實際上使用 引擎蓋下方。 但我要故意這樣做 在越野車的方式。 我會做的方式,我認為 會是正確的,但事實證明, 我的假設是要 是相當,相當的缺陷。 而事實上,相當危險。 因為像我快要錯誤 使得可以通過對手所利用 這樣,您的機器或程序 可以接管可能。 讓我們開始如下。 首先,讓我們聲明我們的字符串, 現在也被稱為一個char星, 並調用它s。 讓接下來的提示輸入字符串的用戶, 與“字符串,請。”和 現在讓我們得到字符串從用戶 使用scanf函數,報價引文結束,“%s的。”在 換句話說,讓我們來告訴scanf函數,我們 確實是希望得到一個字符串 從用戶。 但現在我們需要告訴scanf函數 另一件事 - 放在哪裡的字符串 用戶所提供的。 嗯,我會很簡單地啟動 用逗號秒,指定我想 scanf函數把字符串那裡。 我接下來將要打印出來的東西 如printf“感謝您的%s的 反斜杠Ñ逗號。“與往常一樣,我 要通過在字符串,秒。 現在讓我們保存,編譯並運行此 程序,看看如果我們不能誘發 這個問題我預言。 使scanf函數-1。 ./scanf-1。 字符串請。 讓我們提供的東西一樣,“你好。” “謝謝你的空。”嗯,這不是 我所期待的。 那麼,什麼是怎麼回事? 嗯,原來是因為我們聲明 S作為一個char明星,但我們沒 實際上存儲在s的地址 的實際內存塊,scanf函數沒有 必須隨時隨地把字符串 用戶鍵入。 事實上,如果用戶要鍵入現在在 一個更長的字符串不是“你好”, 比如幾行文字或 文本的幾個段落,這是相當 可能我們會誘發 所謂分段錯誤。 因為scanf函數是不會知道 我還沒有真正把一個地址 裡面的秒。 相反,它會看到一些價值 s中,一些模式位可能 很好是一個垃圾值, 那裡只是偶然。 和scanf還是要去嘗試寫 用戶字符串到該地址, 即使它是一個垃圾值,這 確實可以導致系統崩潰。 那麼我們如何解決這一問題?