命名空间
变体
操作

getline, getwline, getdelim, getwdelim

来自 cppreference.cn
< 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 可以为空,在这种情况下,*n 将被忽略,并且 getline 将分配一个新的缓冲区,如同使用 malloc。如果 delimiter 的值超出 unsigned charEOF 的范围,则行为未定义。
4)(3) 相同,除了字符如同使用 fgetwc 读取,并且 delimiter 必须是有效的 wchar_tWEOF

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

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

目录

[编辑] 参数

lineptr - 指向初始缓冲区或空指针的指针的指针
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)
从文件流中获取宽字符串
(函数) [编辑]
分配内存
(函数) [编辑]