我正在学习在C编程中使用getline并尝试使用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;
}
然而,问题是编译器不断返回错误:对'getline'的未定义引用。 你能告诉我问题是什么吗?谢谢!
我正在使用Win7 64bit + Eclipse Indigo + MinGW
答案 0 :(得分:8)
其他答案涵盖了大部分内容,但存在一些问题。首先,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设置)。有关详细信息,请参阅获取热线手册页(http://linux.die.net/man/3/getline)。
通过更改,您的程序将在我的系统上编译并运行良好。
答案 1 :(得分:3)
getline
不是标准函数,根据我的手册页,你需要设置一个功能测试宏来使用它,
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
对于glibc 2.10或更高版本,
_GNU_SOURCE
之前。
答案 2 :(得分:3)
我也在使用MinGW。我检查了MinGW标头,getline()
没有出现在任何C标头中,它只出现在C ++标头中。这意味着MinGW中不存在C函数getline()
。