2014-09-23 100 views
0

我知道以下警告是我的错,但我需要一些帮助来确定我做错了什么。我越来越:“通过从兼容的指针类型‘函数getline’的参数1”,并为论证2.从不兼容指针类型传递getline()的参数

这里同样的事情,是我调用函数getline():

getline(&line.buf, &maxSz, stdin) 

这里有相关参数声明:

line_t line; 
int maxSz = 1000; 

typedef struct line_t { 
    char buf[1000]; 
    int lineLength; 
    int wordCount; 
    int index; 
} line_t; 

我认为这个问题是我是牛逼提出了什么是指针的地址,但在测试了一些不同的getline调用时,我还没有找到解决方案。我绝对认为参数2是maxSz不是指针的事实。

while (-1 != (line.lineLength = getline((char**) &line.buf, &maxSz, stdin))) { 
     printf("buf is %s\n",line.buf); 

为什么上述给我一个无限循环?

回答

0

关于使用第二个参数的问题:要传递到getline()&maxSzint *类型,但功能getline()预计size_t *类型的第二个参数。 声明

int maxSz = 1000; 

更改为

size_t maxSz = 1000; 

关于第一agrument:我建议你通过char * buf;更换char buf[1000];。当你不知道它的长度时,阅读线条是更好的方法。但不要忘记初始化它(即在致电getline()之前添加buf = 0;)。如果您阅读getline()函数的说明,您会发现,第二个参数未输入。您的maxSz不限制字符串的最大长度(在此变量中,您可以找到读取的字符数,包括分隔符字符,但不包括终止空字节('\ 0'))。尝试编译并分析typical example

+0

非常感谢。这解决了争议2.我会有一个谷歌,以确保我理解size_t正确。你知道如何解决争论1? – user4062632 2014-09-23 03:58:16

+0

非常感谢。那摆脱了它!如果我后来想打印line.buf(仅供参考,我希望这将是stdin的整行),我使用什么格式描述符?我一直在尝试%s,但是这给了我以下信息:“format'%s'期望类型'char *',但参数2的类型为'char(*)[1000]'” – user4062632 2014-09-23 04:06:05

+0

非常感谢。这绝对是惊人的。我可以再问一件事吗?我编辑了这个问题,在底部添加了一些代码。它坚持一遍又一遍地打印相同的行。你能帮我弄明白这是为什么吗? – user4062632 2014-09-23 04:23:17

-1

试试这个:

getline(&line.buf, &sizeof(maxSz), stdin) 
+1

这给了我:“错误:第一个参数需要作为一元运算符的'lvalue'和'操作数',第一个”将'getline'的参数1从不兼容的指针类型传递给第一个参数“,但是谢谢您的建议 – user4062632 2014-09-23 04:01:22

0

你会更好使用fgets代替getline,例如

while (fgets(line.buf, maxSz, stdin) != NULL) 
{ 
    // do something with the line 
} 
+0

有什么区别fgets和getline之间?我一直在使用getline,因为后来我引用了行长(我可以很容易地从getline中获得),并发现用fgets实现同样的事情很困难 – user4062632 2014-09-23 04:03:05

+0

@ user4062632 - getline指望一个指向焦炭。你的代码没有被设置为这样做。要找到这一行的长度,你需要'line.lineLength = strlen(line.buf);' – user3386109 2014-09-23 04:07:35

+0

虽然line.lineLength只给我1000,因为我已经将line.buf的大小设置为1000? – user4062632 2014-09-23 04:09:15

相关问题