- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 655字
- 2020-10-30 17:56:44
2.5.3 C11附錄K邊界檢查接口:gets_s()
C11的gets_s()函數(shù)是gets()的一個兼容且更安全的版本。
gets_s()函數(shù)是一個比fgets()更接近gets()函數(shù)的替代品,它只從stdin指向的流中讀取,且不保留換行符。gets_s()函數(shù)接受一個額外的參數(shù),rsize_t,用于指定輸入的最大字符數(shù)。如果這個參數(shù)等于0或者比RSIZE_MAX更大,或者目標(biāo)字符數(shù)組指針為NULL,將產(chǎn)生一個錯誤條件。如果產(chǎn)生了錯誤條件,那么將不會有任何的輸入動作,并且目標(biāo)字符數(shù)組將不會被更改。否則,該函數(shù)最多讀入比指定數(shù)量少1的字符,并且在最后一個字符讀入數(shù)組后立即在其后加上空字符。例2.11中所示的程序片段使用gets_s()函數(shù)從stdin中讀取一行文本。
例2.11 使用gets_s()從stdin中讀取
1 char buf[BUFSIZ]; 2 3 if (gets_s(buf, sizeof(buf)) == NULL) { 4 /* 處理錯誤 */ 5 }
如果gets_s()函數(shù)執(zhí)行成功,則返回一個指向字符數(shù)組的指針。如果函數(shù)參數(shù)無效、遇到文件結(jié)束標(biāo)志、沒有字符被讀入數(shù)組或者在讀取過程中發(fā)生錯誤,則返回一個空指針。
只有當(dāng)gets_s()函數(shù)讀取一個完整的行(也就是說,它讀取到一個換行符)時,它才執(zhí)行成功。如果無法讀取完整的行,該函數(shù)返回NULL,同時把緩沖區(qū)設(shè)置為空字符串,并清除輸入流至下一個換行符。
如果指定的輸入字符數(shù)超過目標(biāo)緩沖區(qū)的長度,那么gets_s()函數(shù)仍然可能導(dǎo)致緩沖區(qū)溢出。
如前所述,fgets()函數(shù)允許正確編寫的程序安全地處理太長而不能存儲在結(jié)果數(shù)組的輸入行。在一般情況下,這需要fgets()的調(diào)用者注意結(jié)果數(shù)組中是否存在一個換行字符。當(dāng)使用gets_s()處理可能太長的輸入行時,需要重寫其運行約束處理程序(并在完成時,恢復(fù)它的默認(rèn)值)。如果有任何基于換行符的處理需要,那么考慮使用fgets()而不是gets_s()。
- 玩轉(zhuǎn)Scratch少兒趣味編程
- PHP 從入門到項目實踐(超值版)
- HTML5 Mobile Development Cookbook
- HTML5游戲開發(fā)案例教程
- Learn Programming in Python with Cody Jackson
- Web程序設(shè)計(第二版)
- 自然語言處理Python進階
- Learning FuelPHP for Effective PHP Development
- 前端HTML+CSS修煉之道(視頻同步+直播)
- Go語言精進之路:從新手到高手的編程思想、方法和技巧(2)
- Vue.js 2 Web Development Projects
- Xcode 6 Essentials
- Mastering Docker
- 工業(yè)機器人離線編程
- Java多線程并發(fā)體系實戰(zhàn)(微課視頻版)