getline函数的第二个参数有什么作用?

4
#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是用来限制读取字符数的。但是当我输入更多字符时,它仍然读取了所有字符。我在手册和网上搜索了很久,但没有找到答案。有人能给我解释一下吗?


仔细阅读文档通常是有帮助的。 - alk
1个回答

5

getline手册页

给定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会被更新以确保该行适合缓冲区。


1
我读了这个,但是我不理解 *n 的目的。如果函数知道字符串的长度,为什么我们需要传递它?在调用函数之前初始化它的值如何影响程序? - W. Zhu
1
@W.Zhu:假设您知道该行的大小永远不会超过256。在这种情况下,您可以避免额外的realloc()调用。如果该行变得大于256,则readline()不会崩溃(或者奇怪地返回NULL0或其他内容),而是静默地调整大小。因此,好处是双重的。 - David Titarenco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接