c - 尽管导入了 stdio,但 getline 未在此范围内声明

标签 c getline stdio

我需要在 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/

相关文章:

c - Fork/Dup2/Exec 无法与 mkstemp 一起使用

c - (int *) 和 (int []) 是一样的吗?

c - 为什么宏函数ListView_GetSelectedColumn()不起作用?它什么也不返回

c - ‘->’ 的无效类型参数(有 ‘fd_set’ )

c++ - 如果在某些输入之后使用 getline() 将不起作用

c - getchar() 是如何实现的?

c - 如何获取sem_wait()的返回值?

c++ - 这个 Getline 函数的 C++ 代码有什么问题?

c++ - 为什么 seekg 不能与 getline 一起使用?

c - 为什么我的C程序在输入数字后无法完成代码?