命名空间
变体
操作

getline、getwline、getdelim、getwdelim

来自 cppreference.com
< c‎ | experimental‎ | dynamic
在头文件 <stdio.h> 中定义
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
(1) (动态内存 TR)
ssize_t getwline(wchar_t **lineptr, size_t *n, FILE *stream);
(2) (动态内存 TR)
ssize_t getdelim(char ** restrict lineptr, size_t * restrict n,
                 int delimiter, FILE *stream);
(3) (动态内存 TR)
ssize_t getwdelim(wchar_t ** restrict lineptr, size_t * restrict n,
                 wint_t delimiter, FILE * stream);
(4) (动态内存 TR)
1) 行为类似于 getdelim(lineptr, n, '\n', stream)
2) 行为类似于 getwdelim(lineptr, n, L'\n', stream)
3) 从流 stream 中读取,就好像使用 fgetc 一样,直到遇到 delimiter,将字符存储在由 *lineptr 指向的、大小为 *n 的缓冲区中,就好像使用 realloc 一样自动增加其大小以适合整个输入(包括分隔符),并在最后添加一个空终止符。*lineptr 可以为 null,在这种情况下 *n 将被忽略,getline 将分配一个新的缓冲区,就好像使用 malloc 一样。如果 delimiter 的值超出 unsigned charEOF 的范围,则行为未定义。
4)(3) 相同,除了字符按 fgetwc 读取,并且 delimiter 必须是有效的 wchar_tWEOF

如果 *lineptr 不为 null,则如果 *lineptr 不是可以传递给 free 的指针,或者 *n 小于由 *lineptr 指向的分配内存的大小,则行为未定义。

与 Dynamic Memory TR 中的所有函数一样,只有在实现定义了 __STDC_ALLOC_LIB__ 并且用户在包含 stdio.h 之前将 __STDC_WANT_LIB_EXT2__ 定义为整数常量 1 时,getline 才能保证可用。

内容

[编辑] 参数

lineptr - 指向初始缓冲区的指针的指针,或指向 null 指针的指针
n - 指向初始缓冲区大小的指针
delimiter - 分隔符字符
stream - 有效的输入流,由 fopen 打开

[编辑] 返回值

存储在缓冲区中的字符数,包括分隔符,但不包括空终止符。

发生错误时,返回 -1,并在 stream 上设置 feofferror

[编辑] 注释

这些函数与其 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)
从文件流中获取宽字符串
(函数) [编辑]
分配内存
(函数) [编辑]