- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 655字
- 2020-10-30 17:56:44
2.5.3 C11附錄K邊界檢查接口:gets_s()
C11的gets_s()函數是gets()的一個兼容且更安全的版本。
gets_s()函數是一個比fgets()更接近gets()函數的替代品,它只從stdin指向的流中讀取,且不保留換行符。gets_s()函數接受一個額外的參數,rsize_t,用于指定輸入的最大字符數。如果這個參數等于0或者比RSIZE_MAX更大,或者目標字符數組指針為NULL,將產生一個錯誤條件。如果產生了錯誤條件,那么將不會有任何的輸入動作,并且目標字符數組將不會被更改。否則,該函數最多讀入比指定數量少1的字符,并且在最后一個字符讀入數組后立即在其后加上空字符。例2.11中所示的程序片段使用gets_s()函數從stdin中讀取一行文本。
例2.11 使用gets_s()從stdin中讀取
1 char buf[BUFSIZ]; 2 3 if (gets_s(buf, sizeof(buf)) == NULL) { 4 /* 處理錯誤 */ 5 }
如果gets_s()函數執行成功,則返回一個指向字符數組的指針。如果函數參數無效、遇到文件結束標志、沒有字符被讀入數組或者在讀取過程中發生錯誤,則返回一個空指針。
只有當gets_s()函數讀取一個完整的行(也就是說,它讀取到一個換行符)時,它才執行成功。如果無法讀取完整的行,該函數返回NULL,同時把緩沖區設置為空字符串,并清除輸入流至下一個換行符。
如果指定的輸入字符數超過目標緩沖區的長度,那么gets_s()函數仍然可能導致緩沖區溢出。
如前所述,fgets()函數允許正確編寫的程序安全地處理太長而不能存儲在結果數組的輸入行。在一般情況下,這需要fgets()的調用者注意結果數組中是否存在一個換行字符。當使用gets_s()處理可能太長的輸入行時,需要重寫其運行約束處理程序(并在完成時,恢復它的默認值)。如果有任何基于換行符的處理需要,那么考慮使用fgets()而不是gets_s()。
推薦閱讀
- The Supervised Learning Workshop
- jQuery Mobile Web Development Essentials(Third Edition)
- .NET之美:.NET關鍵技術深入解析
- 基于粒計算模型的圖像處理
- Apache Spark 2.x Machine Learning Cookbook
- Python Game Programming By Example
- 三維圖形化C++趣味編程
- Java編程指南:基礎知識、類庫應用及案例設計
- KnockoutJS Starter
- Haxe Game Development Essentials
- Building RESTful Python Web Services
- Scratch趣味編程:陪孩子像搭積木一樣學編程
- Web App Testing Using Knockout.JS
- Learning VMware vSphere
- Java EE架構設計與開發實踐