getline, getwline, getdelim, getwdelim
来自cppreference.com
| 在标头 <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 ,则行为未定义。4) 同 (3) ,除了如同以 fgetwc 读入字符,而
delimiter 必须是合法的 wchar_t 或 WEOF 。若 *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) |
从文件流获取一个宽字符串 (函数) |
| 分配内存 (函数) |