2012-09-03 5 views
26

コマンドラインでstdinから任意の長さの行を一度に読み込もうとしています。私はGNUのreadlineを含めることができるかどうか分からず、ライブラリ関数を使うことを好むだろう。改行が見つかるまで、stdinから行を読み込む方法は?

私が読んだドキュメントには、getlineが動作しなければならないことが示唆されていますが、私の実験ではブロックされません。私のサンプルプログラム:

#include <stdio.h> 
int main() 
{ 
    char *line = NULL; 
    if (getline(&line, NULL, stdin) == -1) { 
     printf("No line\n"); 
    } else { 
     printf("%s\n", line); 
    } 
    return 0; 
} 

No lineを生成し、ユーザーの入力を受け付けることが適しません。

どうすればよいですか?私はそれが自明であるべきであることを知っているが、私はそれを理解することができなかった。

+1

'getline()' *は*ブロックします( 'stdin'でテスト済み)。サンプルコードを投稿できますか? – LSerni

+1

[Cでコンソールから行を読み込む方法](http://stackoverflow.com/questions/314401/how-to-read-a-line-from-the-console-in-c) –

答えて

44

char *line = NULL; 
+size_t size; 
+if (getline(&line, &size, stdin) == -1) { 
-if (getline(&line, 0, stdin) == -1) { 
    printf("No line\n"); 
} else { 
+3

これで解決します。そして、私は間違いを認識します。私はドキュメントを誤読し、 'n'は' size_t * 'の代わりに 'size_t'だったと考えました。ありがとうございました! – Taymon

+32

私はこの回答のコードのバージョンコントロールスタイルが本当に好きです。 – whirlwin

+2

これはなぜ機能するのですか?ドキュメントでは、行がヌルポインタであるときにサイズが無視され、サイズにヌルポインタを渡すことができると書かれているので、私は仮定しました。 –

4

このパッチを試してみてください、私はgetlineの "ノンブロッキング" の挙動を再現することができました:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
     char *buffer; 
     size_t n = 1024; 
     buffer = malloc(n); 
     return getline(&buffer, &n, stdin); 
} 

getline(&buffer...ブロック。 NULLbufferに割り当てると、広告されたとおりにブロックされ、新しく割り当てられたバッファにその行が格納されます。

しかし、私は

getline(NULL, &n, stdin); 

を書くならば、getlineは失敗し、は妨げないようです。おそらく無効なnまたはファイルポインタも同じ動作を引き起こす可能性があります。これが問題だろうか?

関連する問題