命名空间
变体
操作

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

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

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

目录

[编辑] 参数

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