官术网_书友最值得收藏!

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()。

主站蜘蛛池模板: 将乐县| 广平县| 曲麻莱县| 师宗县| 会东县| 垫江县| 武功县| 星子县| 虎林市| 专栏| 松桃| 台安县| 临泉县| 三河市| 金平| 东海县| 靖远县| 平利县| 芜湖市| 宕昌县| 于都县| 城步| 德化县| 铜梁县| 红桥区| 武义县| 金山区| 桃江县| 突泉县| 玉山县| 广河县| 泸定县| 黄龙县| 梅州市| 都江堰市| 桑日县| 固原市| 屏东县| 叶城县| 墨竹工卡县| 江阴市|