最近作遊戲編輯器,本身試着用C/C++寫了一個讀取簡單配置表的函數,在控制檯下測試的時候,使用了C的標準庫gets函數,發現編譯器報告gets函數unsafe,網上搜索了一下,發現gets函數不對接受字符串的buffer進行邊界檢測,會形成越界,從而產生bug;本身寫的東西,也是本身用的東西,固然能夠在定義配置表的時候獲得控制,從而不會使越界的狀況出現,可是總的來講這不是一個好的思考方式;因而按照網上的提示改用了fgets函數替代; 編輯器
使用fgets函數後,就發現問題了,原來的代碼不能正常工做了,調試了一通,發現使用fgets函數獲取的字符串與gets函數獲取的不同,fgets函數獲取的字符串會在buffer裏面保留換行符,而gets函數不會;好吧,問題找到了,解決也很簡單,把最後一個換行符拿掉,換成'\0'就能夠了。而後,又發現有個gets_s函數,能夠像gets同樣不會獲取換行符,也不會有gets的越界問題,而後在cppreference.com查看了這幾個函數的描述,卻發現gets_s函數是一個標準庫擴展函數,一個可選項;因此就不知道這個gets_s函數在各個編譯器下的支持狀況如何!做罷,仍是使用fgets函數吧。 函數
這裏所引發的思考是:不少的庫函數都有着一些很細節的限制,而它的reference通常都會有詳細的描述,這就得在使用庫函數時去詳細的瞭解庫的條件和限制,以避免因對庫的片面理解,而形成bug. 測試