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

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

主站蜘蛛池模板: 高邑县| 泾川县| 康定县| 讷河市| 大同市| 灵石县| 恩平市| 清丰县| 修水县| 新蔡县| 镇江市| 静乐县| 黄骅市| 商南县| 长阳| 吉木萨尔县| 广东省| 上饶市| 拉孜县| 芜湖县| 秦皇岛市| 德格县| 巴彦淖尔市| 镇沅| 新巴尔虎右旗| 泾源县| 牙克石市| 万州区| 正定县| 高邮市| 宜宾县| 伊川县| 博白县| 阿克陶县| 安丘市| 武胜县| 岗巴县| 万年县| 沈丘县| 新化县| 南雄市|