尽管导入stdio,但getline未在此范围内声明
我需要在C中使用getline()
,但是当我写:
#define _GNU_SOURCE #include #include #include int main(int argc, char** argv) { char *line; getline(&line, NULL, stdin); free(line); return (0); }
编译器写入error: getline was not declared in this scope
我该怎么办? getdline是不是在stdio.h
被推迟了? 我之前从未遇到过这种问题。
我使用GCC GNU编译器。
您需要定义_GNU_SOURCE
以使用此函数,在包含stdio.h
之前定义它或将其作为-D_GNU_SOURCE
传递给编译,因为这是GNU扩展函数。
另一个可能的原因是你的GLIBC没有这个function,所以要么尝试:
-
在
/usr/include/stdio.h
使用它 -
测试
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
就像手册页所说(包括features.h
)
以下实现可能有效(未经测试):
#define INTIAIL_SIZE 100 size_t getline(char **lineptr, size_t *n, FILE *stream) { char c; size_t read = 0; char *tmp; if (!*lineptr) { if (!n) *n = INTIAIL_SIZE; tmp = malloc(*n); *lineptr = tmp; } else tmp = *lineptr; while ((c = fgetc(stream)) != '\n') { *tmp++ = c; if (++read >= *n) { char *r = realloc(tmp, *n * 2); if (!r) { errno = ENOMEM; return -1; } else tmp = r; } } *n = read; return read; }
您目前的错误:
-
你使用它之后就不会释放
line
了 -
你不是通过引用传递,因为函数原型是:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
因此char **lineptr