【问题标题】:What is the purpose of the second parameter in getline?getline中第二个参数的作用是什么?
【发布时间】:2017-05-02 23:12:57
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char* buffer = malloc(100 * sizeof(char));
    size_t n = 3;

    getline(&buffer, &n, stdin);
    printf("%s\n", buffer);
    free(buffer);
}

我以为getline 中的第二个参数size_t *n 是为了限制读取的字符数。但是当我尝试使用更大的输入时,它仍然会读取所有输入。我在手册页和在线搜索但找不到答案。谁能帮我解释一下?

【问题讨论】:

  • 仔细阅读文档很有帮助。

标签: c getline


【解决方案1】:

来自getline man pages

给定ssize_t getline(char **lineptr, size_t *n, FILE *stream);

如果 *lineptr 为 NULL,那么 getline() 将分配一个缓冲区用于存储 该行应该由用户程序释放。 (在这种情况下, *n 中的值被忽略。)

或者,在调用 getline() 之前,*lineptr 可以包含一个 指向 malloc(3) 分配的缓冲区 *n 字节大小的指针。 如果 缓冲区不够大,无法容纳行,getline() 调整它的大小 realloc(3),根据需要更新 *lineptr 和 *n。

强调我的。简而言之,n 已更新以确保线路适合。

【讨论】:

  • 我读了这个,但我不明白*n 的目的。如果函数知道字符串有多长,为什么我们需要传递它?我们在调用函数之前初始化它的值对程序有什么影响?
  • @W.Zhu:假设你知道行的大​​小永远不会大于256。在这种情况下,您可以避免额外的realloc() 调用。如果这条线变得比256 大,那么readline() 不会爆炸(或者奇怪地返回NULL0 或其他东西),而是默默地调整大小。所以好处是双重的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2019-10-10
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多