Namespaces
Variants

getline, getwline, getdelim, getwdelim

From cppreference.net
定义于头文件 <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 ,将字符存储到大小为 *n 的缓冲区(由 *lineptr 指向),并自动通过 realloc 扩展缓冲区以容纳包括分隔符在内的完整输入内容,同时添加空终止符。 realloc 返回的指针会被写回 *lineptr 。若 *lineptr 为空指针,则忽略 *n 的先前值, getline 会通过 malloc 分配新缓冲区。无论何种情况,最终分配的缓冲区长度都会被写入 *n 。若 delimiter 的值超出 unsigned char EOF 的范围,则行为未定义。
4) (3) 相同,区别在于字符读取方式类似于 fgetwc ,且 delimiter 必须是有效的 wchar_t WEOF

如果 *lineptr 不为空,当 *lineptr 不是可传递给 free 的指针,或当 *n 大于 *lineptr 所指向的已分配内存大小时,其行为是未定义的。如果 n 不是适合写入 size_t 类型值的有效指针,其行为同样未定义。

与动态内存技术报告中的所有函数一样,只有当实现定义了 __STDC_ALLOC_LIB__ 且用户在包含 stdio.h 头文件之前将 __STDC_WANT_LIB_EXT2__ 定义为整型常量 1 时,才保证 getline 函数可用。

目录

参数

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)
从文件流获取宽字符串
(函数)
分配内存
(函数)