2016-12-17 7 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); 
} 

私はgetlinesize_t *nの2番目のパラメータは、読み込まれる文字数を制限すると考えていました。しかし、大きな入力で試してみると、それでもすべての入力が読み込まれます。マニュアルページとオンラインで検索しましたが、回答が見つかりませんでした。誰も私のためにそれを説明できますか? getline man pagesからgetlineの2番目のパラメータの目的は何ですか?

+0

ドキュメントをよく読んで読み進めてください。 – alk

答えて

4

は:lineptrがNULLである*、その後のgetline()ユーザプログラムによって解放されなければならないラインを、 格納するバッファを割り当てる場合

ssize_t getline(char **lineptr, size_t *n, FILE *stream);を考えます。 (ここで、* nの 値は無視される。)あるいは

、()のgetlineを呼び出す前に、* lineptrはmalloc関数に ポインタを含むことができる(3)バッファ*を-allocated Nサイズのバイト。 バッファが十分な大きさで行を保持できない場合、getline()は realloc(3)でサイズを変更し、必要に応じて* lineptrと* nを更新します。

強調鉱山。要するに、nが更新され、行が収まるようにします。

+0

私はこれを読んだが、 '* n 'の目的を理解できなかった。関数が文字列の長さを知っている場合、なぜそれを渡す必要がありますか?関数を呼び出す前に初期化した値はどのようにプログラムに影響しますか? –

+0

@ W.Zhu:行のサイズが決して '256'より大きくないことを知っているとしましょう。その場合、余分な 'realloc()'呼び出しを避けることができます。行が '256'よりも大きくなった場合、' readline() 'は吹き飛ばされません(あるいは' NULL'や '0'か何かを返す)が、静かにサイズを変更します。だから利益は二倍です。 –

関連する問題