cplusplus.com指出,getline函数的第二个参数是
写入s的最大字符数
但是,我看过这样的代码:
size_t linecap = 0;
ssize_t linelen;
linelen = getline(&line, &linecap, fp);
Run Code Online (Sandbox Code Playgroud)
这不是从源读取0个字节吗?还是还有其他事情发生?
不,这是不正确的。在手册页上,(重点是我的)
如果
*lineptr为NULL,getline()则将分配用于存储行的缓冲区,该缓冲区应由用户程序释放。(在这种情况下,in中的值将*n被忽略。)或者,在调用之前
getline(),*lineptr可以包含一个指向大小为malloc(3)分配的缓冲区*n字节的指针。如果缓冲区的大小不足以容纳该行,请getline()使用realloc(3),更新*lineptr和*n根据需要调整其大小。在这两种情况下,成功调用,
*lineptr并且*n将被更新,以反映缓冲区地址,分别分配大小。
因此,第二个参数所指向的内存中存储的初始值对实际扫描没有影响。扫描值并将其填充到缓冲区后,
*n将告诉您分配给存储输入的缓冲区的大小(通常大于扫描的输入的大小)。