2016-12-17 145 views
2
#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,0 size_t *n中的第二個參數是限制讀取的字符數。但是當我用更大的輸入嘗試時,它仍然讀取所有的輸入。我在手冊頁和在線搜索,但無法找到答案。有誰能爲我解釋嗎?getline中第二個參數的用途是什麼?

+0

仔細閱讀文檔主要有助於。 – alk

回答

4

getline man pages

ssize_t getline(char **lineptr, size_t *n, FILE *stream);鑑於

如果* lineptr爲NULL,則函數getline()將分配一個緩衝器,用於存儲 線,這應當由用戶程序被釋放。 (在這種情況下,在 * n中的值將被忽略。)

可替換地,在調用函數getline(前),* lineptr可以包含 指針的malloc(3)在尺寸-allocated緩衝器* n個字節。 如果 緩衝區不足以容納該行,getline()將使用 realloc(3)調整其大小,並根據需要更新* lineptr和* n。

強調我的。總之,n已更新,以確保線路適合。

+0

我讀過這個,但是我無法理解'* n'的用途。如果函數知道字符串有多長,爲什麼我們需要傳遞它?在調用函數之前,我們初始化的值如何影響程序? –

+0

@ W.Zhu:假設你知道這條線的大小決不會大於'256'。在這種情況下,你可以避免額外的'realloc()'調用。如果這行比'256'大,那麼'readline()'不會爆炸(或奇怪地返回NULL或'0'),而是默默調整大小。所以這個好處是雙重的。 –

相關問題