getline, getwline, getdelim, getwdelim
< c | experimental | dynamic
定义于头文件 <stdio.h>
|
||
(1) | (动态内存 TR) | |
(2) | (动态内存 TR) | |
(3) | (动态内存 TR) | |
(4) | (动态内存 TR) | |
1) 表现同 getdelim(lineptr, n, '\n', stream) 。
2) 表现同 getwdelim(lineptr, n, L'\n', stream) 。
3) 如同用 fgetc 从流
stream
读取直至遇到 delimiter
,并将字符存储于 *lineptr
所指向的大小为 *n
的缓冲区,如同用 realloc 自动增加其大小以适应包含分隔符的整个输入,再加上空终止符。 *lineptr
可以为空,该情况下忽略 *n
, getline
如同用 malloc 分配一个新缓冲区。
若 delimiter
拥有 unsigned char
范围外的值且非 EOF ,则行为未定义。若 *lineptr
非空,则若 *lineptr
不是能传递给 free 的指针,或若 *n
小于 *lineptr
所指向内存的被分配大小,则行为未定义。
同所有来自动态内存 TR 的函数, getline
仅若实现定义了 __STDC_ALLOC_LIB__ 且用户在包含 stdio.h
前定义 __STDC_WANT_LIB_EXT2__ 为整数常量 1 才保证可用。
参数
lineptr | - | 指针,指向空指针,或指向指向最初缓冲区的指针 |
n | - | 指向最初缓冲区大小的指针 |
delimiter | - | 分隔字符 |
stream | - | fopen 打开的合法输入流 |
返回值
存储于缓冲区的字符数,包含分隔符,但排除空终止符。
错误时返回 -1 并设置 stream
上的 feof 或 ferror 。
注意
这些函数等同于其 POSIX 版本,除了允许但不要求在错误时设置 errno 。
示例
运行此代码
#ifdef __STDC_ALLOC_LIB__ #define __STDC_WANT_LIB_EXT2__ 1 #else #define _POSIX_C_SOURCE 200809L #endif #include <stdio.h> #include <stdlib.h> void get_y_or_n(void) { char *response = NULL; size_t len; printf("Continue? [y] n: "); if((getline(&response, &len, stdin) < 0) || (len && response[0] == 'n')) { free(response); exit(0); } free(response); return; } int main(void) { get_y_or_n(); }
输出:
Continue? [y] n:
参阅
从文件流获取一个字符串 (函数) | |
(C11 中移除)(C11) |
从 stdin 读取一个字符串 (函数) |
(C95) |
从文件流获取一个宽字符串 (函数) |
分配内存 (函数) |