Подтвердить что ты не робот

Undefined ссылка на `getline 'в c

Я изучаю использование getline в программировании на языке C и пробовал коды из http://crasseux.com/books/ctutorial/getline.html

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int atgc, char *argv[])
{
    int bytes_read = 1;
    int nbytes = 10;
    char *my_string;

    my_string = (char *)malloc(nbytes+1);

    puts("Please enter a line of text");

    bytes_read = getline(&my_string, &nbytes, stdin);

    if (bytes_read == -1)
    {
        puts ("ERROR!");
    }
    else
    {
        puts ("You typed:");
        puts (my_string);
    }

    return 0;
 }

Однако проблема заключается в том, что компилятор сохраняет возвращаемые ошибки: undefined ссылка на 'getline'. Не могли бы вы рассказать мне, в чем проблема? Спасибо!

Я использую Win7 64bit + Eclipse Indigo + MinGW

4b9b3361

Ответ 1

Другие ответы покрыли большую часть этого, но есть несколько проблем. Во-первых, getline() не находится в стандартной библиотеке C, а является расширением POSIX 2008. Обычно он будет доступен с совместимым с POSIX компилятором, так как макросы _POSIX_C_SOURCE будут определены с соответствующими значениями. Возможно, у вас более старый компилятор, прежде чем getline() был стандартизован, и в этом случае это расширение GNU, и вы должны #define _GNU_SOURCE до #include <stdio.h> включить его и должны использовать GNU-совместимый компилятор, такой как gcc.

Кроме того, nbytes должен иметь тип size_t, а не int. В моей системе, по крайней мере, они имеют разный размер, причем size_t длиннее, а использование int* вместо size_t* может иметь серьезные последствия (а также не компилируется с настройками gcc по умолчанию). Подробнее см. Страницу руководства getline (http://linux.die.net/man/3/getline).

С внесенными изменениями ваша программа компилируется и работает отлично в моей системе.

Ответ 2

getline не является стандартной функцией, вам нужно установить макрос проверки функций, чтобы использовать его, согласно моей странице man,

_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700

для glibc 2.10 или новее,

_GNU_SOURCE

до этого.

Ответ 3

Я также использую MinGW. Я проверил заголовки MinGW и getline() не появляется ни в одном из заголовков C, он появляется только в заголовках С++. Это означает, что функция C getline() не существует в MinGW.

Ответ 4

Для меня компилятор говорит

getline.cpp: В функции 'int main (int, char *):   getline.cpp: 15: 52: error: невозможно преобразовать 'int to' size_t * {aka long unsigned int *} для аргумента '2' '__ssize_t getline (char **, size_t *, FILE *)

Проверьте свой компилятор, компоновщик, папку с библиотекой. Может быть, переустановить?


Напишите свою собственную функцию readline. Это просто. Прочитайте char на char, пока не получите новую строку