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

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()的替代函數

主站蜘蛛池模板: 郴州市| 苏州市| 北碚区| 阜新市| 紫云| 辉南县| 庄浪县| 开鲁县| 东明县| 聊城市| 盐源县| 山东省| 阿克苏市| 报价| 班玛县| 大兴区| 汝城县| 福州市| 赣榆县| 棋牌| 江安县| 绥江县| 岑巩县| 宁河县| 武川县| 中宁县| 漳浦县| 固原市| 松阳县| 怀柔区| 泾阳县| 中牟县| 读书| 义马市| 黄大仙区| 文成县| 吉木乃县| 德格县| 诸暨市| 石台县| 武平县|