我需要在 C 中使用 getline()
,但是当我编写时:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
char *line;
getline(&line, NULL, stdin);
free(line);
return (0);
}
编译器写入错误:getline未在此范围内声明
我该怎么办? getline不是在stdio.h中声明的吗?我以前从未遇到过此类问题。
我使用 GCC GNU 编译器。
最佳答案
您需要定义_GNU_SOURCE
才能使用此函数,可以在包含stdio.h
之前定义它,或者将其作为-D_GNU_SOURCE<传递给编译
因为这是一个 GNU 扩展函数。
另一个可能的原因是您的 GLIBC 没有此功能,因此请尝试:
在
中查找它/usr/include/stdio.h
测试
_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
后,您没有释放它您没有通过引用传递
line
,因为函数原型(prototype)为:ssize_t getline(char **lineptr, size_t *n, FILE *stream);
因此char **lineptr
关于c - 尽管导入了 stdio,但 getline 未在此范围内声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20335695/