【问题标题】:Passing arguments of getline() from incompatible pointer type从不兼容的指针类型传递 getline() 的参数
【发布时间】:2014-09-23 03:39:18
【问题描述】:

我知道以下警告是我的错,但我需要一些帮助来弄清楚我做错了什么。我得到:“从不兼容的指针类型传递'getline'的参数1”,参数2也是一样的。

这是我对 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);

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

【问题讨论】:

    标签: c pointers compiler-warnings getline


    【解决方案1】:

    关于第二个参数的问题:getline()&maxSzint * 类型,但函数 getline() 需要 size_t * 类型的第二个参数。 更改声明

    int maxSz = 1000;
    

    size_t maxSz = 1000;
    

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

    【讨论】:

    • 非常感谢。这为参数 2 修复了它。我将有一个谷歌来确保我正确理解 size_t。你知道如何解决参数 1 的问题吗?
    • 非常感谢。那摆脱了它!如果我以后想打印 line.buf(仅供参考,我希望这将是一整行标准输入),我使用什么格式描述符?我一直在尝试 %s,但这给了我以下信息:“格式 '%s' 需要类型 'char ',但参数 2 的类型为 'char ()[1000]'”
    • 非常感谢。这真是太棒了。我可以再问一件事吗?我已经编辑了问题以在最底部添加一些代码。它一遍又一遍地打印同一行。你能帮我弄清楚这是为什么吗?
    • 哦!不用担心!无限循环在其他地方。我的错!无论如何,非常感谢你们的帮助和坚持(因为我仍然掌握了这个窍门)。你太棒了!
    【解决方案2】:

    您最好使用fgets 而不是getline,例如

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

    【讨论】:

    • fgets 和 getline 有什么区别?我一直在使用 getline,因为我后来参考了行长(我可以很容易地从 getline 获得),并发现用 fgets 实现同样的事情很困难
    • @user4062632 -- getline 需要指向 char 的指针的地址。您的代码未设置为执行此操作。要查找行的长度,您需要line.lineLength = strlen(line.buf);
    • line.lineLength 是否只给我 1000,因为我已将 line.buf 的大小设置为 1000?
    • 不,C 中的字符串以 NUL 字符结尾,也写为 '\0'getlinefgets 都在字符串的末尾放了一个NUL,这样strlen 就可以确定字符串的长度了。
    【解决方案3】:

    试试这个:

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

    【讨论】:

    • 这给了我:“错误:第二个参数需要左值作为一元'&'操作数”,第一个参数是“从不兼容的指针类型传递'getline'的参数1”,但谢谢为您的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2016-01-27
    • 2011-08-17
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多