- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 654字
- 2020-10-30 17:56:44
2.5.4 動態分配函數
ISO/IEC TR 24731-2描述了來自POSIX的getline()函數。getline()函數的行為與fgets()類似,但提供了一些額外的功能。首先,如果輸入行過長,那么該函數使用realloc()調整緩沖區的大小,而不是截斷輸入。其次,如果它執行成功,則返回讀取的字符數,這對于確定在輸入的換行符之前是否有任何空字符是非常有用的。getline()函數僅適用于使用malloc()分配的緩沖區。如果傳入一個空指針,則函數getline()會分配一個大小足夠容納輸入的緩沖區。因此,隨后用戶必須明確地用free()釋放該緩沖區。當分隔符等于換行符時,getline()函數相當于getdelim()函數(getdelim()函數也在ISO/IEC TR 24731-2中定義)。例2.12中所示的程序片段使用getline()函數從stdin中讀取一行文本。
例2.12 使用函數getline()從stdin中讀入
01 int ch; 02 char *p; 03 size_t buffer_size = 10; 04 char *buffer = malloc(buffer_size); 05 ssize_t size; 06 07 if ((size = getline(&buffer, &buffer_size, stdin)) == -1) { 08 /* 處理錯誤 */ 09 } else { 10 p = strchr(buffer, '\n'); 11 if (p) { 12 *p = '\0'; 13 } else { 14 /* 未找到換行符, 刷新標準輸入至行尾 */ 15 while (((ch = getchar()) != '\n') 16 && !feof(stdin) 17 && !ferror(stdin) 18 ); 19 } 20 } 21 22 /* ... 對緩沖區進行處理 ... */ 23 24 free(buffer);
getline()函數返回寫入緩沖區的字符數目,包括換行符,如果在文件結束前遇到它。如果發生讀取錯誤,流中的錯誤標記就被設置,函數getline()返回–1。因此,此函數的設計違反《C安全編碼標準》[Seacord 2008],“ERR 02-C.避免帶內錯誤標志”,因為ssize_t類型是以提供帶內錯誤標志為目的而被創建的。
注意,此代碼也沒有檢查malloc()是否執行成功。然而,如果malloc()失敗,它返回NULL,這被傳遞給getline()函數,getline()函數將及時地分配它自己的一個緩沖區。
表2.4總結了本節中描述的gets()的一些替代函數。所有這些函數都可以安全地使用。
表2.4 gets()的替代函數
推薦閱讀
- Learning Cython Programming
- Hyper-V 2016 Best Practices
- VSTO開發入門教程
- React.js Essentials
- Mastering LibGDX Game Development
- JavaScript動態網頁開發詳解
- 從Excel到Python:用Python輕松處理Excel數據(第2版)
- OpenGL Data Visualization Cookbook
- 深度學習原理與PyTorch實戰(第2版)
- 代替VBA!用Python輕松實現Excel編程
- Python大規模機器學習
- Angular Design Patterns
- 程序員必會的40種算法
- Sitecore Cookbook for Developers
- 計算機應用基礎案例教程(第二版)